attachment

更新时间:2022-11-27 09:31:23 阅读: 评论:0


2022年11月27日发(作者:什么是托收)

elasticarchingest-attachment对于word、pdf等⽂件内容的索引

【转】

【转】

1.简介

ElasticSearch只能处理⽂本,不能直接处理⽂档。要实现ElasticSearch的附件导⼊需要以下两个步骤:

⼀、对多种主流格式的⽂档进⾏⽂本抽取。

⼆、将抽取出来的⽂本内容导⼊ElasticSearch。

Ingest-Attachment是⼀个开箱即⽤的插件,替代了较早版本的Mapper-Attachment插件,使⽤它可以实现对(PDF,DOC等)主流格式

⽂件的⽂本抽取及⾃动导⼊。

Elasticarch5.x新增⼀个新的特性IngestNode,此功能⽀持定义命名处理器管道pipeline,pipeline中可以定义多个处理器,在数据

插⼊ElasticSearch之前进⾏预处理。⽽IngestAttachmentProcessorPlugin提供了关键的预处理器attachment,⽀持⾃动对⼊库

⽂档的指定字段作为⽂档⽂件进⾏⽂本抽取,并将抽取后得到的⽂本内容和相关元数据加⼊原始⼊库⽂档。

由于ElasticSearch是基于JSON格式的⽂档数据库,所以附件⽂档在插⼊ElasticSearch之前必须进⾏Ba64编码。

以下使⽤RESTAPI调⽤⽅式。

2.环境

ElasticSearch5.3.0

ElasticSearch-head-master插件(安装指路Elasticarch学习--elasticarch-head插件安装)

Ingest-attachment插件(官⽅介绍IngestAttachmentProcessorPlugin)

Cygwin(curl+perl)

3.实现步骤

3.1建⽴⾃⼰的⽂本抽取管道pipeline

3.2创建新的索引

此处索引名为estest。

curl-XPUT“localhost:9200/estest”-d’{

“ttings”:{

“index”:{

“number_of_shards”:1,

“number_of_replicas”:0

}}}’

3.3载⼊数据

⽅法⼀:直接载⼊ba64源码

curl-XPUT"localhost:9200/_ingest/pipeline/attachment"-d'{

"description":"Extractattachmentinformation",

"processors":[

{

"attachment":{

"field":"data",

"indexed_chars":-1,

"ignore_missing":true

}

},

{

"remove":{"field":"data"}

}]}'

⾸先要确定ba64编码正确,否则因为乱码可能⽆法正确⽣成attachment。

这⾥:index-pdftesttype-pdfid-1皆为⾃定义

载⼊结果显⽰:(这⼀版data数据尚未删除)

⽅法⼆:载⼊PDF的同时进⾏转码导⼊

⾸先跳转⾄指定⽂件⽬录

这⾥我的⽂件放在⽬录D:ElasticSearchFile下

cdD:/ElasticSearch/File

使⽤perl脚本的解码功能:

“’|perl-pe's/n/n/g'‘”

完整代码:

curl-XPUT"localhost:9200/pdftest/pdf/1?pipeline=attachment"-d'

{

"data":"QmFzZTY057yW56CB6K+05piOCuOAgOOAgEJhc2U2NOe8lueggeimgeaxguaKijPkuKo45L2N5a2X6IqC77yIMyo4PTI077yJ6L2s5YyW5Li6NOS4q

}'

curl-XPUT"localhost:9200/estest/pdf/10?pipeline=attachment"-d'

{

"data":"'`|perl-pe's/n/n/g'`'"

}'

结果如图,可以导⼊成功:

全⽂索引,查询指定字段

注意查询字段名称,这个真的纠结了我太久……

查询结果:

total=1意为找到⼀个,由此验证字段可查询。

curl-XPOST"localhost:9200/pdftest/pdf/_arch?pretty"-d'{

"query":{

"match":{

"t":"编码"

}}}'

5.参考⽬录

convertthefileintoba64inelasticarchforattachment

ElasticSearch全⽂检索实战

elasticarch使⽤附件进⾏中⽂检索,⽆法查询中⽂的问题

Gettingerrorwhileparsingdocuments

SendingAttachments:Unexpectedend-of-inputinVALUE_STRING

HowtoindexapdffileinElasticarch5.0.0withingest-attachmentplugin?

6.想法

其实流程⾛下来还挺简单,但当时⼩⽩⼊门,我还是困扰了挺久的,查阅各路资料最终成功导⼊。虽然也不厉害,但还是记录⼀下,缕清整

个流程,希望能帮到⼤家。^_^

⼀、概述

Elasticarch是⼀个分布式的RESTful风格的搜索和数据分析引擎,它基于Lucene实现了强⼤的全⽂检索功能。本⽂针对⼀个通⽤的

应⽤场景,讲解如何利⽤ElasticSearch快速实现对关系型数据库⽂本和常见⽂档格式附件的全⽂检索。

⼆、应⽤场景

描述

数字图书馆有⼀套基于MySQL的电⼦书管理系统,电⼦书的基本信息保存在数据库表中,书的数字内容以多种常见的⽂档格式(PDF、

Word、PPT、RTF、TXT、CHM、EPUB等)保存在存储系统中。现在需要利⽤ElasticSearch实现⼀套全⽂检索系统,以便⽤户可以通

过对电⼦书的基本信息和数字内容进⾏模糊查询,快速找到相关书籍。

数据结构

数据库表BOOK结构:

{

"took":1,

"timed_out":fal,

"_shards":{

"total":5,

"successful":5,

"failed":0

},

"hits":{

"total":1,

"max_score":1.0446626,

"hits":[

{

"_index":"pdftest",

"_type":"pdf",

"_id":"6",

"_score":1.0446626,

"_source":{

"data":"QmFzZTY057yW56CB6K+05piOCuOAgOOAgEJhc2U2NOe8lueggeimgeaxguaKijPkuKo45L2N5a2X6IqC77yIMyo4PTI077yJ6L2s5YyW5Li6N

"attachment":{

"content_type":"text/plain;chart=UTF-8",

"language":"lt",

"content":"Ba64编码说明n Ba64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前⾯补两个0,形成8位⼀

"content_length":212}

}

}

]

}

}

CREATETABLEbook(

idvarchar(100)NOTNULL,

titlevarchar(50)DEFAULTNULL,

descvarchar(1000)DEFAULTNULL,

pathvarchar(200)DEFAULTNULL,

create_timedatetimeDEFAULTNULL,

update_timedatetimeDEFAULTNULL,

PRIMARYKEY(id)

)ENGINE=InnoDBDEFAULTCHARSET=utf8

字段意义

id主键

title书名

desc介绍

path存储路径

create_time创建时间

update_time更新时间

逻辑约束:创建书籍记录时,create_time等于update_time,即当前时间,每次更新书籍时,更新update_time时间。全⽂检索系统根

据update_time时间更新书籍索引。

三、技术⽅案

⽰意图

基本思路就是:

1.定期扫描MySQL中的book表,根据字段update_time批量抓取最新的电⼦书数据。

2.从path字段获取电⼦书数字内容的⽂档存储路径。从存储系统中抓取电⼦书⽂档并进⾏BASE64编码。

3.将从book表批量抓取的数据转换为JSON⽂档,并将BASE64编码后的电⼦书⽂档合并⼊JSON,⼀同写⼊ElasticSearch,利

⽤ElasticSearch的插件IngestAttachmentProcessorPlugin对电⼦书⽂档进⾏⽂本抽取,并进⾏持久化,建⽴全⽂索引。

本⽂采⽤开源数据处理⼯具ApacheNiFi来实现上述流程,具体使⽤⽅法后续实施过程会详细讲解。如果读者不了解ApacheNiFi

,也可以使⽤Logstash、Kettle等⼯具或者使⽤⾃⼰熟悉的编程语⾔开发应⽤来完成上述流程。

Linux/Unix下运⾏bin/elasticarch(在windows操作系统下运⾏)

ElasticSearch的默认服务端⼝是9200,所有API都可以通过REST⽅式调⽤。

关于JVM内存:ElasticSearch是基于Java开发,部署需要配置合理的JVMHeap内存,官⽅建议分配内存不⾼于本机物理内存的⼆分之

⼀,最好不要超过32G。具体配置⽅法如下:

设置环境变量ES_HEAP_SIZE,ElasticSearch启动时会读取这个环境变量。在命令⾏运⾏如下:

安装⽅法:

在安装⽬录下运⾏

安装⽅法:

在安装⽬录下运⾏

./bin/elasticarch-plugininstallingest-attachment

安装过程中提⽰此插件需要⼀些额外的权限,输⼊y回车,继续安装即可,运⾏结果:

Continuewithinstallation?[y/N]y

->Installedingest-attachment

安装成功后,在plugin⽂件夹下可以看到出现了ingest-attachment⽂件夹。

重新启动ElasticSearch

所有插件安装完成后重新启动ElasticSearch

五、⽂档附件的⽂本抽取

解决⽅式

ElasticSearch只能处理⽂本,不能直接处理⼆进制⽂档。要利⽤ElasticSearch实现附件⽂档的全⽂检索需要2个步骤:

1.对多种主流格式的⽂档进⾏⽂本抽取。

2.将抽取出来的⽂本内容导⼊ElasticSearch,利⽤ElasticSearch强⼤的分词和全⽂索引能⼒。

上⽂安装的IngestAttachmentProcessorPlugin是⼀个开箱即⽤的插件,使⽤它可以帮助ElasticSearch⾃动完成这2个步骤。

基本原理是利⽤ElasticSearch的IngestNode功能,此功能⽀持定义命名处理器管道pipeline,pipeline中可以定义多个处理器,在数

据插⼊ElasticSearch之前进⾏预处理。⽽IngestAttachmentProcessorPlugin提供了关键的预处理器attachment,⽀持⾃动对⼊

库⽂档的指定字段作为⽂档⽂件进⾏⽂本抽取,并将抽取后得到的⽂本内容和相关元数据加⼊原始⼊库⽂档。

因为ElasticSearch是基于JSON格式的⽂档数据库,所以附件⽂档在插⼊ElasticSearch之前必须进⾏Ba64编码。

建⽴⽂本抽取管道

ElasticSearch⽀持RESTAPI,我们可以⽤cURL、Postman等⼯具调⽤。为⽅便查看,本⽂使⽤如下这种表⽰⽅式来展⽰REST调

⽤,请注意,它并不是可执⾏代码。

{

“description”:“Extractattachmentinformation”,

“processors”:[

{

“attachment”:{

“field”:“data”,

“ignore_missing”:true

}

},

{

“remove”:{

“field”:“data”

}

}

]

}

以上,我们建⽴了1个命名pipeline即“attachment”,其中定义了2个预处理器“attachment”和“remove”,它们按定义顺

序对⼊库数据进⾏预处理。

“attachment”预处理器即上⽂安装的插件“IngestAttachmentProcessorPlugin”提供,将⼊库⽂档字段“data”视为⽂档附件

进⾏⽂本抽取。要求⼊库⽂档必须将⽂档附件进⾏BASE64编码写⼊“data”字段。

⽂本抽取后,后续不再需要保留BASE64编码的⽂档附件,将其持久化到ElasticSearch中没有意义,”remove”预处理器⽤于将其从

源⽂档中删除。

如何使⽤pipeline

按照ElasticSearch的API定义,插⼊⽂档时可以在请求地址末尾加

pipeline=attachment的形式指定使⽤上⽂建⽴的“attachment”命名pipeline。

六、建⽴⽂档结构映射

ElasticSearch是⽂档型数据库,以JSON⽂档为处理对象。⽂档结构以mapping形式定义,相当于关系型数据库建⽴表结构。以下,我

们建⽴MySQL的book表在ElasticSearch中的⽂档结构映射。

除了book表中的原有字段外,我们在ElasticSearch中增加了“attachment”字段,这个字段是“attachment”命名pipeline抽取

⽂档附件中⽂本后⾃动附加的字段。这是⼀个嵌套字段,其包含多个⼦字段,包括抽取⽂本content和⼀些⽂档信息元数据。

在本⽂的应⽤场景中,我们需要对book的title、desc和t进⾏全⽂检索,所以在建⽴mapping时,我们为这3个

字段指定分析器“analyzer”为“ik_max_word”,以让ElasticSearch在建⽴全⽂索引时对它们进⾏中⽂分词。

本⽂不是专门的ApacheNiFi教程,只针对相关应⽤场景介绍如何使⽤ApacheNiFi。

ApacheNiFi基于java开发,要求运⾏环境为JDK8.0以上。

常⽤配置在conf⽬录下的ties和⽂件中,详见:NiFiSystemAdministrator’sGuide

PUTlocalhost:9200/book

{

"mappings":{

"idx":{

"properties":{

"id":{

"type":"keyword"

},

"title":{

"type":"text",

"analyzer":"ik_max_word"

},

"desc":{

"type":"text",

"analyzer":"ik_max_word"

},

"path":{

"type":"keyword"

},

"create_time":{

"type":"date",

"format":"yyyy-MM-ddHH:mm:ss||yyyy-MM-dd||epoch_millis"

},

"update_time":{

"type":"date",

"format":"yyyy-MM-ddHH:mm:ss||yyyy-MM-dd||epoch_millis"

},

"attachment":{

"properties":{

"content":{

"type":"text",

"analyzer":"ik_max_word"

}

}

}

}

}

}

}

其中,web控制台端⼝在ies⽂件中的参数修改,默认值8080。JVM启动参数在⽂件

中,内存分配在#JVMmemoryttings段,默认-Xms512m-Xmx512m。

本⽂当前最新版本5.1.46,将拷贝到NiFi安装⽬录备⽤。

启动ApacheNiFi

命令⾏进⼊ApacheNiFi⽬录,运⾏命令./bin/t

ApacheNiFi的常⽤命令:

NiFi控制台

下载模板⽂件,然后点击控制台左侧“Operate”操作栏⾥的“UploadTemplate”上传模板。

上传模板

应⽤模板

拖拽控制台顶部⼀排组件图标中的“Template”到空⽩⽹格区域,在弹出的“AddTemplate”窗⼝中选择刚刚上传的模板“FullText-

mysql”,点击“Add”。空⽩⽹格区域将出现如下下图的“processgroup”,它是⼀组“processor”的集合,我们的处理流程就

是由这组“processor”按照数据处理逻辑有序组合⽽成。

NiFi模板

双击此“processgroup”进⼊,将看到完整的流程配置,如下图:

NiFiprocessgroup

运⾏这个流程之前需要完成⼏个配置项:

配置并启动数据库连接池

在空⽩⽹格处点击⿏标右键,在弹出菜单中点击“configure”,在弹出的“FullText-mysqlConfiguration”窗⼝中打开“controller

rvices”标签页如下图,点击表格中“DBCPConnectionPool”右侧“Configure”图标,进⾏数据库连接池配置。NiFi

controllerrvices

在弹出的“ConfigureControllerService”窗⼝中打开“PROPERTIES”标签页,在表格中填写MySQL数据库相关信息,如下图:

配置数据库连接池

其中的“DatabaDriverLocation(s)”填写我们下载的“”路径。配置好数据库连接池以后

点击“APPLY”回到“controllerrvices”标签页,点击表格中“DBCPConnectionPool”右侧“Enable”图标启动数据库连接

池。

修改变量

在空⽩⽹格处点击⿏标右键,在弹出菜单中点击“variables”,打开“Variables”窗⼝,修改表格中的“elasticSearchServer”参

数值为ElasticSearch服务地址,修改表格中的“rootPath”参数为电⼦书数字⽂档在⽂件系统中的根路径。

回到“processgroup”流程页⾯,在空⽩⽹格处点击⿏标右键,在弹出菜单中点击“start”菜单,启动流程。

⾄此,我们完成了本⽂应⽤场景中ApacheNiFi的流程配置。ApacheNiFi每隔10秒扫描MySQL的book表,抓取最新的电⼦书数

据,处理后导⼊ElasticSearch。

⼋、全⽂检索查询

完成以上内容,我们应该已经将MySQL数据库中的电⼦书信息导⼊ElasticSearch,并建⽴了全⽂索引。

本章应⽤场景中,我们想要对电⼦书的“title”、”desc”、”t”(抽取⽂本)进⾏全⽂检索,帮助⽤户快速找到关

键词为“计算”的全部电⼦书。

本章沿⽤前述⽅式展⽰全⽂检索请求结构:

“_source”⽤于从返回结果中将“”字段过滤掉,因为此字段是从电⼦书中抽取的⽂本,内容太⼤,我们不希望在

列表查询中显⽰它。

ElasticSearch默认是分页查询,以“from”和“size”分别表⽰偏移量和每页记录数。

请注意,这段不是可执⾏程序,这样写仅仅是为了⽅便查看。以下为对应的cURL调⽤命令:

本文发布于:2022-11-27 09:31:23,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/90/30186.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:stance
下一篇:strife
标签:attachment
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图