大文本的全文检索方案附件索引

alt

一、简介

Elasticsearch附件索引是需要插件支持的功能,它允许将文件内容附加到Elasticsearch文档中,并对这些附件内容进行全文检索。本文将带你了解索引附件的原理和使用方法,并通过一个实际示例来说明如何在Elasticsearch中索引和检索文件附件。

索引附件的核心原理是通过Ingest Attachment Processor将文件内容转换成Elasticsearch文档中的字段。该插件使用Apache Tika来提取文档中的附件内容,并将其转换为可索引的文本。

二、环境

version: '3.8'
services:cerebro:image: lmenezes/cerebro:0.8.3container_name: cerebroports:- "9000:9000"command:- -Dhosts.0.host=http://eshot:9200networks:- elastickibana:image: docker.elastic.co/kibana/kibana:8.1.3container_name: kibanaenvironment:- I18N_LOCALE=zh-CN- XPACK_GRAPH_ENABLED=true- TIMELION_ENABLED=true- XPACK_MONITORING_COLLECTION_ENABLED="true"- ELASTICSEARCH_HOSTS=http://eshot:9200- server.publicBaseUrl=http://192.168.160.234:5601ports:- "5601:5601"networks:- elasticeshot:image: elasticsearch:8.1.3container_name: eshotenvironment:- node.name=eshot- cluster.name=es-docker-cluster- discovery.seed_hosts=eshot,eswarm,escold- cluster.initial_master_nodes=eshot,eswarm,escold- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms512m -Xmx512m"- xpack.security.enabled=false- node.attr.node_type=hotulimits:memlock:soft: -1hard: -1volumes:- D:\zuiyuftp\docker\es8.1\eshot\data:/usr/share/elasticsearch/data- D:\zuiyuftp\docker\es8.1\eshot\logs:/usr/share/elasticsearch/logs- D:\zuiyuftp\docker\es8.1\eshot\plugins:/usr/share/elasticsearch/pluginsports:- 9200:9200networks:- elasticeswarm:image: elasticsearch:8.1.3container_name: eswarmenvironment:- node.name=eswarm- cluster.name=es-docker-cluster- discovery.seed_hosts=eshot,eswarm,escold- cluster.initial_master_nodes=eshot,eswarm,escold- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms512m -Xmx512m"- xpack.security.enabled=false- node.attr.node_type=warmulimits:memlock:soft: -1hard: -1volumes:- D:\zuiyuftp\docker\es8.1\eswarm\data:/usr/share/elasticsearch/data- D:\zuiyuftp\docker\es8.1\eswarm\logs:/usr/share/elasticsearch/logs- D:\zuiyuftp\docker\es8.1\eshot\plugins:/usr/share/elasticsearch/pluginsnetworks:- elasticescold:image: elasticsearch:8.1.3container_name: escoldenvironment:- node.name=escold- cluster.name=es-docker-cluster- discovery.seed_hosts=eshot,eswarm,escold- cluster.initial_master_nodes=eshot,eswarm,escold- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms512m -Xmx512m"- xpack.security.enabled=false- node.attr.node_type=coldulimits:memlock:soft: -1hard: -1volumes:- D:\zuiyuftp\docker\es8.1\escold\data:/usr/share/elasticsearch/data- D:\zuiyuftp\docker\es8.1\escold\logs:/usr/share/elasticsearch/logs- D:\zuiyuftp\docker\es8.1\eshot\plugins:/usr/share/elasticsearch/pluginsnetworks:- elastic# volumes:
#   eshotdata:
#     driver: local
#   eswarmdata:
#     driver: local
#   escolddata:
#     driver: localnetworks:elastic:driver: bridge

三、安装 ingest-attachment 插件

首先创建一个处理文本的管道,指定读取文档中content字段的内容进行处理

PUT _ingest/pipeline/attachment
{"description" : "Extract attachment information","processors" : [{"attachment" : {"field" : "content"}}]
}

我们的elasticsearch版本是8.1,所以默认还是没有内置的,需要手动添加一下,因为我是docker启动的,所以进入到docker容器内部,执行如下命令进行安装

./bin/elasticsearch-plugin install ingest-attachment

安装完成之后进行重启elasticsearch集群进行激活插件的启用

我这边是三个节点,在hot节点下安装完成之后只会在当前节点下有此插件

现在插件已经安装好了,继续执行刚才的定义文本处理通道进行创建

PUT _ingest/pipeline/attachment
{"description" : "Extract attachment information","processors" : [{"attachment" : {"field" : "content"}}]
}

在上面的定义中指定的attachment的过滤字段是content,所以我们在写入elasticsearch索引内容时,文件的内容需要保存到content字段中

四、添加测试数据

下面我们创建一个保存文档详细信息的索引,比如文件题名,类型,文件内容等字段

PUT /zfc-doc-000003
{"mappings": {"properties": {"id":{"type": "keyword"},"title":{"type": "text","analyzer": "ik_max_word"},"content": {"type": "text","analyzer": "ik_max_word"}}}
}

通过上面两步的操作之后我们的测试环境就算搭建完成了,下面就可以进行大文本内容的读取测试了,首先我们还是准备几个测试的文本文件,比如txtdocpdf等类型的纯文本文件

下面使用python脚本写入索引内容,首先安装一下elasticsearch的相关依赖

pip install elasticsearch

下面是读取文件夹C://Users//zuiyu//Documents//mydoc//20230806//demo//1下的所有文本文件保存到elasticsearch的索引zfc-doc-000003中的python脚本,保存为txt.py后面会用到

import os
from elasticsearch import Elasticsearch
import base64

# 定义Elasticsearch客户端连接
es = Elasticsearch("http://localhost:9200")

# 定义索引名称
index_name = "zfc-doc-000003"

# 定义文件夹路径
folder_path = "C://Users//zuiyu//Documents//mydoc//20230806//demo//1"

# 遍历文件夹下的所有文件
for root, dirs, files in os.walk(folder_path):
    for filename in files:
        # 构建文件的完整路径
        file_path = os.path.join(root, filename)

        # 读取文件内容,并以字节类型(bytes-like)返回
        with open(file_path, "rb"as file:
            file_content = file.read()

        # 使用base64.b64encode()函数将文件内容转换为base64编码
        base64_content = base64.b64encode(file_content).decode("utf-8")

        # 构建索引文档
        document_body = {
            "title": filename,  # 使用文件名作为文档标题
            "content": base64_content  # 将base64编码后的内容保存到字段 "content" 中
        }

        # 执行索引操作,并指定pipeline为 "attachment"
        es.index(index=index_name, body=document_body, pipeline="attachment")

print("所有文件已成功保存到Elasticsearch索引中。")

该脚本中需要注意的点有如下三个

1、elasticsearch服务器地址

2、需要读取的文件夹地址

3、保存的索引名称与保存文本内容的字段名称

4、指定创建的pipeline

C://Users//zuiyu//Documents//mydoc//20230806//demo//1文件夹下有三个文件用来做测试,他们的文本内容分别如下图所示

alt

其中为了方便测试,1.txt与2.txt仅有一句话

下面执行python脚本txt.py保存到elasticsearchzfc-doc-000003中,并指定使用pipelineattachment

python txt.py

脚本执行成功之后的截图如下图所示,输出所有文件已成功保存到Elasticsearch索引中。即为成功导入

alt

下面我们进行检索验证,因为上面咱们创建的索引中,文本内容是保存到content字段中的,所以我们对content字段进行分词检索(content使用的是ik分词器,不是很了解的可以参考之前的文章进行一下安装)

1、首先检索条件是内容,预期结果是返回第一个文档与第三个文档

2、再次检索mysql,返回第一个文档

通过上面两个小例子,可以验证出来的结论就是,我们在文本内容过大需要对内容进行检索时,可以使用提前指定的pipeline进行预处理

五、设置读取文本范围

Elasticsearch中,Ingest Attachment Processor插件的indexed_chars参数默认值是100000,表示将文本内容的前100000保存在索引字段中

如果将其设置为-1Elasticsearch会保存所有文本内容。这可能会导致索引文档过大,对性能和资源造成影响,特别是当处理大文本时。

为了避免索引文档过大的问题,我们可以根据实际情况设置indexed_chars参数,将其设置为较小的值,限制保存的字符数。这样可以减小索引文档的大小,降低Elasticsearch的负担。

假如限制保存的字符数为50000,可以如下设置:

PUT _ingest/pipeline/attachment
{
  "description""Pipeline for processing attachments",
  "processors": [
    {
      "attachment": {
        "field""content",
        "indexed_chars"50000
      }
    }
  ]
}

这样,只有前50000个字符会被保存在content字段中,而超过这个字符数的部分则会被截断,不会保存在索引中。

如果想单独设定某个文档的取值范围,也可以在索引的文档中指定字段值,举例如下

PUT _ingest/pipeline/attachment_max
{"description" : "Extract attachment information","processors" : [{"attachment" : {"field" : "content","indexed_chars": 6,"indexed_chars_field" : "max_size",}}]
}
PUT /zfc-doc-000005
{"mappings": {"properties": {"id":{"type": "keyword"},"title":{"type": "text","analyzer": "ik_max_word"},"content": {"type": "text","analyzer": "ik_max_word"}}}
}
POST zfc-doc-000005/_doc?pipeline=attachment_max
{"id":"10",
"content":"5Litc2FkZ+eahOmqhOWCsuWIu+W9leacuuWNoea0m+aWr+Wkp+iSnOS7t+agvOWWgOS7gOinieW+l+aWr+WNoeaLiemjkuWNjg==","max_size":10
}
POST zfc-doc-000005/_doc?pipeline=attachment_max
{"id":"11","content":"5Litc2FkZ+eahOmqhOWCsuWIu+W9leacuuWNoea0m+aWr+Wkp+iSnOS7t+agvOWWgOS7gOinieW+l+aWr+WNoeaLiemjkuWNjg=="
}
GET zfc-doc-000005/_search
{"query": {"term": {"id": {"value": "11"}}}
}

使用"indexed_chars_field" : "max_size",指定文档中的字段,根据文档中的max_size字段来决定要取多少文本索引到字段中,如果文档中没有指定max_size则使用pipeline中指定的indexed_chars大小

六、移除二进制源文本

除了使用上述指定读取文本文件的指定长度,还可以使用另一个参数 "remove_binary": true控制来判断是否保存二进制编码的文本

PUT _ingest/pipeline/attachment_max
{"description" : "Extract attachment information","processors" : [{"attachment" : {"field" : "content","remove_binary": true}}]
}

remove_binary 设置为true即不保存原始二进制文本,只会保存解析之后的结果,这种处理方式可以大大的减少存储空间

七、优点

  1. 轻量化索引文档:使用Ingest Attachment Processor处理文本内容时,只会将文本的元数据(例如文件路径或URL)以及转换后的attachment类型的内容保存在索引文档中,而不是保存整个文本内容。这样可以显著减小索引文档的大小,节省存储空间,并提高索引和检索的性能。

  2. 全文搜索功能:通过Pipeline中的Ingest Attachment Processor处理文本内容后,Elasticsearch可以支持全文搜索功能,可以对文本进行全文检索,查找包含指定关键词的文档。

  3. 灵活的数据处理:Pipeline机制允许在文本内容存储到Elasticsearch之前进行预处理。可以通过Pipeline添加其他处理器来进行数据转换、清理或提取。

  4. 易于维护和扩展:使用Pipeline可以将数据处理逻辑与索引操作解耦,使代码结构更清晰,易于维护和扩展。如果以后有其他数据处理需求,只需要修改Pipeline而不需要修改索引操作。

  5. 可以实现附件类型:使用Ingest Attachment Processor可以将文本内容转换为attachment类型,这是Elasticsearch内置的一种特殊数据类型,支持对文档内容的索引和全文检索。

八、缺点

  1. 存储需求:虽然使用attachment类型可以减小索引文档的大小,但是仍然需要在Elasticsearch中存储文本内容的转换结果。对于大量大文本内容的情况,仍需要较大的存储空间,并且最好使用"remove_binary": true移除二进制文本。

  2. 内存消耗:在处理大文本内容时,Ingest Attachment Processor需要将文本内容暂存到内存中进行处理,因此会消耗较多的内存资源。如果处理大量大文本,可能导致内存压力增加,影响性能。

  3. 处理性能:虽然使用Pipeline可以在索引之前进行预处理,但Ingest Attachment Processor的处理速度仍然会受到限制。在处理大量大文本内容时,可能导致处理速度较慢,影响索引性能。

  4. 不适用于实时场景:由于Ingest Attachment Processor处理文本内容需要较多的计算和存储资源,适用于离线或批处理的场景。对于实时索引或对性能要求较高的场景,可能需要考虑其他方案。

  5. 不支持所有文件类型:虽然attachment类型支持多种文件类型,但仍有一些特殊文件类型可能不受支持。在使用Pipeline中的Ingest Attachment Processor处理文本内容时,需要注意文件类型的兼容性。

  6. 额外的配置和维护:使用Pipeline需要额外的配置和维护,需要定义处理器、设置参数等

  7. 依赖插件:Ingest Attachment ProcessorElasticsearch的一个插件,需要确保插件的版本与Elasticsearch版本兼容

九、总结

使用Pipeline中的Ingest Attachment Processor处理文本内容可以在不影响检索功能的前提下,优化索引文档的大小,提高索引和检索的性能,并灵活地处理和扩展数据。这是处理大文本内容时的一种高效和可靠的方式。虽然Pipeline中的Ingest Attachment Processor处理大文本内容是一种高效和灵活的方式,但仍然存在一些挑战和限制。在实际使用中,需要综合考虑实际需求、资源限制和性能要求,选择合适的处理方案。如果处理大量大文本或对性能要求较高,可能需要考虑其他优化措施或方案。

十、需要注意的点

  1. 索引性能:处理大文本时,Pipeline的执行可能会占用较多的CPU和内存资源,特别是在处理多个大文本时。这可能会对Elasticsearch的索引性能和整体系统性能造成影响。在处理大文本之前,建议评估系统的性能和资源利用情况,确保系统有足够的资源来执行处理。

  2. 超时设置:Pipeline的执行可能需要一定的时间,尤其是在处理大文本时。如果Pipeline的执行时间超过了Elasticsearch的默认超时设置,可能会导致任务失败。你可以通过设置timeout参数来延长超时时间,确保Pipeline有足够的时间来执行。

  3. 错误处理:在Pipeline的处理过程中,可能会出现各种错误,例如文本解析错误、索引失败等。你需要注意适当处理这些错误,以避免任务失败导致整个操作中断。可以使用适当的异常处理机制,或者使用ElasticsearchBulk API来进行批量索引,确保部分文档处理失败时,不会影响其他文档的索引。

  4. 内存管理:处理大文本时,可能会产生较大的临时数据,需要注意内存的管理和及时释放。确保处理过程中不会产生内存泄漏或内存溢出问题。

  5. 文件路径安全性:如果使用文件路径来索引文本内容,需要注意文件路径的安全性。确保文件路径是合法的、可信的,并限制访问范围,避免可能的安全风险。

  6. 版本兼容性:使用Pipeline时,需要注意插件的版本与Elasticsearch的版本兼容性。确保使用的Pipeline插件与Elasticsearch版本兼容,并定期升级插件以保持稳定性和安全性。

总的来说,处理大文本时,需要综合考虑性能、资源利用、错误处理等方面的问题,合理设计和优化Pipeline的处理过程。在实际应用中,可以进行压力测试和性能测试,找到最合适的处理方案,确保系统能够稳定高效地处理大文本内容。

参考链接

https://www.elastic.co/guide/en/elasticsearch/reference/8.9/attachment.html

如果感觉本文对你有所帮助欢迎点赞评论转发收藏。如果你想了解更多关于ES的骚操作,更多实战经验,欢迎关注。

原文链接:

https://mp.weixin.qq.com/s?__biz=MzIwNzYzODIxMw==&mid=2247486041&idx=1&sn=08e3b981c512a8a24afd3778cd3f231a&chksm=970e11f3a07998e5f7bbe017409944e4b57a0d800b2a149f7c291091f5b2b32b6493c3586257#rd

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/44503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot---内置Tomcat 配置和切换

😀前言 本篇博文是关于内置Tomcat 配置和切换,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力&#x…

Spring Cloud Alibaba -微服务架构(二)

1. 微服务架构介绍 微服务架构, 简单的说就是将单体应用进一步拆分,拆分成更小的服务,每个服务都是一个可以独立运行的项目。 1.1 微服务架构的常见问题 一旦采用微服务系统架构,就势必会遇到这样几个问题: 这么多小…

(已解决)PySpark : AttributeError: ‘DataFrame‘ object has no attribute ‘iteritems‘

AttributeError: ‘DataFrame’ object has no attribute ‘iteritems’ 原因在使用SparkSession对象中createDataFrame函数想要将pandas的dataframe转换成spark的dataframe时出现的 因为createDataFrame使用了新版本pandas弃用的iteritems(),所以报错 解决办法&…

city walk结合VR全景,打造新时代下的智慧城市

近期爆火的city walk是什么梗?它其实是近年来备受追捧的城市漫步方式,一种全新的城市探索方式,与传统的旅游观光不同,城市漫步更注重与城市的亲密接触,一步步地感受城市的脉动。其实也是一种自由、休闲的方式&#xff…

Vue的鼠标键盘事件

Vue的鼠标键盘事件 原生 鼠标事件(将v-on简写为) click // 点击 dblclick // 双击 mousedown // 按下 mousemove // 移动 mouseleave // 离开 mouseout // 移出 mouseenter // 进入 mouseover // 鼠标悬浮mousedown.left 键盘事件 keydown //键盘按下时触发 keypress …

Django实现音乐网站 ⑾

使用Python Django框架制作一个音乐网站, 本篇主要是前端开发前的一些必要配置和首页展示开发。 目录 配置应用路由 创建应用路由文件 应用路径加入项目路径 创建项目模板 创建项目及应用模板路径 设置模板路径 设置静态资源路径 创建静态资源路径 配置静态…

thinkphp6前后端验证码分离以及验证

1.验证码接口生成验证码: public function verify(){return captcha(); } 也可以自己写方法 2.验证方法和普通模式session验证有区别,需要改原文件: 修改后的代码: <?php // +---------------------------------------------------------------------- // | ThinkP…

Shell脚本基础( 四: sed编辑器)

目录 1 简介 1.1 sed编辑器的工作流程 2 sed 2.1 基本用法 2.2 sed基本格式 2.2.1 sed支持正则表达式 2.2.2 匹配正则表达式 2.2.3 奇数偶数表示 2.2.4 -d选项删除 2.2.5 -i修改文件内容 2.2.6 -a 追加 2.3 搜索替代 2.4 变量 1 简介 sed是一种流编辑器&#xff0c;…

最快的JS甘特图:Bryntum Gantt 5.5.1 Crack

最快的JS甘特图 Bryntum Gantt 是一个超快速且完全可定制的甘特图套件&#xff0c;适用于您的 React / Angular / Vue / JS 应用程序。 快如闪电 甘特图是用纯 JavaScript / ES6 构建的&#xff0c;并使用非常快速的渲染引擎。这意味着您可以加载大型数据集&#xff0c;并且仍然…

自动化测试用例设计实例

在编写用例之间&#xff0c;笔者再次强调几点编写自动化测试用例的原则&#xff1a; 1、一个脚本是一个完整的场景&#xff0c;从用户登陆操作到用户退出系统关闭浏览器。 2、一个脚本脚本只验证一个功能点&#xff0c;不要试图用户登陆系统后把所有的功能都进行验证再退出系统…

Windows如何部署Jenkins

一、简介 Jenkins 是国际上流行的免费开源软件项目&#xff0c;基于Java 开发持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;提供一个开放的易用的软件平台&#xff0c;使软件的持续集成自动化&#xff0c;大大节约人力和时效。 二、Java JDK 访问 OpenLogic…

Threejs学习05——球缓冲几何体背景贴图和环境贴图

实现随机多个三角形随机位置随机颜色展示效果 这是一个非常简单基础的threejs的学习应用&#xff01;本节主要学习的是球面缓冲几何体的贴图部分&#xff0c;这里有环境贴图以及背景贴图&#xff0c;这样可以有一种身临其境的效果&#xff01;这里环境贴图用的是一个.hdr的文件…

C语言入门_Day7 逻辑运算

目录&#xff1a; 前言 1.逻辑运算 2.优先级 3.易错点 4.思维导图 前言 算术运算用来进行数据的计算和处理&#xff1b;比较运算是用来比较不同的数据&#xff0c;进而来决定下一步怎么做&#xff1b;除此以外还有一种运算叫做逻辑运算&#xff0c;它的应用场景也是用来影…

C语言:字符函数和字符串函数

往期文章 C语言&#xff1a;初识C语言C语言&#xff1a;分支语句和循环语句C语言&#xff1a;函数C语言&#xff1a;数组C语言&#xff1a;操作符详解C语言&#xff1a;指针详解C语言&#xff1a;结构体C语言&#xff1a;数据的存储 目录 往期文章前言1. 函数介绍1.1 strlen1.…

WebStrom 前端项目Debug

1. 正常启动前端项目 2. 配置webStrom的JavaScript Debugger 点击Edit Configurations添加avaScript Debug填写URL 为项目启动路径配置要Debug的浏览器-remote-allow-origins* &#xff08;最重要&#xff0c;否则唤起的是一个about:blank空白页面&#xff09; 3. 启动Debug模…

于vue3+vite+element pro + pnpm开源项目

河码桌面是一个基于vue3viteelement pro pnpm 创建的monorepo项目&#xff0c;项目采用的是类操作系统的web界面&#xff0c;操作起来简单又方便&#xff0c;符合用户习惯&#xff0c;又没有操作系统的复杂&#xff01; 有两个两个分支&#xff0c;一个是web版本&#xff0c;…

二维码智慧门牌管理系统:打造社区管理新格局

文章目录 前言一、精准数据支持的实现二、便捷办事流程的提升三、多元化服务渠道的拓展四、高效管理和优质服务的提供 前言 在科技的推动下&#xff0c;社区管理正在迎来一场革命性的变革。其中&#xff0c;二维码智慧门牌管理系统崭露头角&#xff0c;成为了社区管理的得力助…

python高级基础

文章目录 python高级基础闭包修饰器单例模式跟工厂模式工厂模式单例模式 多线程多进程创建websocket服务端手写客户端 python高级基础 闭包 简单解释一下闭包就是可以在内部访问外部函数的变量&#xff0c;因为如果声明全局变量&#xff0c;那在后面就有可能会修改 在闭包中的…

物联网智慧安防实训综合实训基地建设方案

一、系统概述 物联网智慧安防实训综合实训基地是一个为学生提供综合实践、培养技能的场所&#xff0c;专注于物联网技术与智慧安防应用的培训和实训。通过物联网智慧安防实训综合实训基地的建设和运营&#xff0c;学生可以在真实的环境中进行实践训练&#xff0c;提高其物联网技…

嵌入式入门教学——C51(中)

嵌入式入门教学汇总&#xff1a; 嵌入式入门教学——C51&#xff08;上&#xff09;嵌入式入门教学——C51&#xff08;中&#xff09;嵌入式入门教学——C51&#xff08;下&#xff09; 目录 七、矩阵键盘 八、定时器和中断 九、串口通信 十、LED点阵屏 十一、DS1302实…