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小时内删除。
留言与评论(共有 0 条评论) |