【elasticsearch实战】知识库文件系统检索工具FSCrawler

需求背景

最近有一个需求需要建设一个知识库文档检索系统,这些知识库物料附件的文档居多,有较多文档格式如:PDF, Open Office, MS Office等,需要将这些格式的文件转化成文本格式,写入elasticsearch 的全文检索索引,方便搜索。 我这里介绍一种工具不考虑文件原来格式,但能方便将转化的文档写入到对应的es 索引,并且支持OCR识别扫描版本的pdf文档。

FSCrawler介绍

使用官方文档
github:https://github.com/dadoonet/fscrawler/tree/master

主要功能

  1. 本地文件系统(挂载盘)爬取和创建文件索引,更新已经存在的和删除旧的文档;
  2. 远程文件系统爬取例如:SSH/FTP等;
  3. 允许 REST 接口方式上传你的二进制文件到 es。

下载和安装

docker 下载

docker pull dadoonet/fscrawler

运行

docker run -it --rm \-v ~/.fscrawler:/root/.fscrawler \-v ~/tmp:/tmp/es:ro \dadoonet/fscrawler fscrawler job_name
  1. /root/.fscrawler 是程序的工作目录,会读取该目录下的_settings.yaml 文件,如果不存在会默认创建一个;
  2. /tmp/es:ro 是待爬取的文件目录,该文件夹下的文件会被读取,写入es 对应的索引,其中索引可以在_settings.yaml 中指定,如果不指定会默认创建索引名为,启动任务的名称job_name_folder

实践说明

我们下面创建一个爬取任务 job_name 为例进行功能说明。

创建工作目录

我创建一个工作目录如下:

/data/workspace/app/fscrawler

我在这个文件夹下创建了一个文件目录:./es 用于存放我需要索引的文件,_settings.yaml用于配置爬取的任务。

_settings.yaml 文件配置

为了验证各种文件格式,

  1. 我配置了支持ocr 识别,支持中文和英文字符识别;
  2. 为了能快速验证,文件目录检查时间我设置为1min;
  3. 配置了一个es 数据库用于存储解析后的数据,但没指定索引。
    _settings.yaml 文件如下(具体字段意义见注释说明):
---
name: "job_name" # job name
fs:url: "/tmp/es" # 要索引文件路径update_rate: "1m" # 更新频率excludes: # 排除文件- "*/~*"json_support: false # 是否支持jsonfilename_as_id: false # 是否将文件名作为idadd_filesize: true # 是否添加文件大小remove_deleted: true # 是否删除已删除的文件add_as_inner_object: false # 是否将文件内容作为内部对象store_source: false # 是否存储源文件index_content: true # 是否索引内容attributes_support: false # 是否支持属性raw_metadata: false # 是否原始元数据xml_support: false # 是否支持xmlindex_folders: true # 是否索引文件夹lang_detect: false # 是否检测语言continue_on_error: false # 是否继续错误add_as_inner_object: true # 是否将文件内容作为内部对象ocr:language: "chi_sim+eng" # 识别语言enabled: true # 是否启用ocrpdf_strategy: "ocr_and_text" # pdf策略follow_symlinks: false # 是否跟随符号链接
elasticsearch:nodes:- url: "http://xxx.xxx.xxx.xxx:9200"username: xxxpassword: xxxxbulk_size: 100flush_interval: "5s"byte_size: "10mb"ssl_verification: truepush_templates: true

启动任务

docker run -it --rm \-v /data/workspace/app/fscrawler:/root/.fscrawler \-v /data/workspace/app/fscrawler/es:/tmp/es:ro \dadoonet/fscrawler fscrawler job_name02:41:04,665 INFO  [f.console] ,----------------------------------------------------------------------------------------------------.
|       ,---,.  .--.--.     ,----..                                     ,--,           2.10-SNAPSHOT |
|     ,'  .' | /  /    '.  /   /   \                                  ,--.'|                         |
|   ,---.'   ||  :  /`. / |   :     :  __  ,-.                   .---.|  | :               __  ,-.   |
|   |   |   .';  |  |--`  .   |  ;. /,' ,'/ /|                  /. ./|:  : '             ,' ,'/ /|   |
|   :   :  :  |  :  ;_    .   ; /--` '  | |' | ,--.--.       .-'-. ' ||  ' |      ,---.  '  | |' |   |
|   :   |  |-, \  \    `. ;   | ;    |  |   ,'/       \     /___/ \: |'  | |     /     \ |  |   ,'   |
|   |   :  ;/|  `----.   \|   : |    '  :  / .--.  .-. | .-'.. '   ' .|  | :    /    /  |'  :  /     |
|   |   |   .'  __ \  \  |.   | '___ |  | '   \__\/: . ./___/ \:     ''  : |__ .    ' / ||  | '      |
|   '   :  '   /  /`--'  /'   ; : .'|;  : |   ," .--.; |.   \  ' .\   |  | '.'|'   ;   /|;  : |      |
|   |   |  |  '--'.     / '   | '/  :|  , ;  /  /  ,.  | \   \   ' \ |;  :    ;'   |  / ||  , ;      |
|   |   :  \    `--'---'  |   :    /  ---'  ;  :   .'   \ \   \  |--" |  ,   / |   :    | ---'       |
|   |   | ,'               \   \ .'         |  ,     .-./  \   \ |     ---`-'   \   \  /             |
|   `----'                  `---`            `--`---'       '---"                `----'              |
+----------------------------------------------------------------------------------------------------+
|                                        You know, for Files!                                        |
|                                     Made from France with Love                                     |
|                           Source: https://github.com/dadoonet/fscrawler/                           |
|                          Documentation: https://fscrawler.readthedocs.io/                          |
`----------------------------------------------------------------------------------------------------'02:41:04,683 INFO  [f.p.e.c.f.c.BootstrapChecks] Memory [Free/Total=Percent]: HEAP [560.9mb/8.7gb=6.25%], RAM [19.6gb/35gb=56.2%], Swap [0b/0b=0.0].
02:41:04,860 WARN  [f.p.e.c.f.s.Elasticsearch] username is deprecated. Use apiKey instead.
02:41:04,860 WARN  [f.p.e.c.f.s.Elasticsearch] password is deprecated. Use apiKey instead.
02:41:04,869 INFO  [f.p.e.c.f.FsCrawlerImpl] Starting FS crawler
02:41:04,869 INFO  [f.p.e.c.f.FsCrawlerImpl] FS crawler started in watch mode. It will run unless you stop it with CTRL+C.
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.
SLF4J: Class path contains SLF4J bindings targeting slf4j-api versions 1.7.x or earlier.
SLF4J: Ignoring binding found at [jar:file:/usr/share/fscrawler/lib/log4j-slf4j-impl-2.22.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See https://www.slf4j.org/codes.html#ignoredBindings for an explanation.
02:41:05,230 INFO  [f.p.e.c.f.c.ElasticsearchClient] Elasticsearch Client connected to a node running version 8.8.1
02:41:05,266 INFO  [f.p.e.c.f.c.ElasticsearchClient] Elasticsearch Client connected to a node running version 8.8.1
02:41:05,331 INFO  [f.p.e.c.f.FsParserAbstract] FS crawler started for [job_name] for [/tmp/es] every [1m]
02:42:05,430 INFO  [f.p.e.c.f.t.TikaInstance] OCR is enabled. This might slowdown the process.

启动成功后,如果是首次启动,没有指定索引和settings.yaml 文件的话会自动创建,当日志会给出警告。

启动成功后文件目录发生了变化:

  1. 自动创建_default文件夹, 该文件夹下会生成es版本6,7,8对应的全文索引的默认的schema
  2. 自动创建一个_status.json文件,用来检查上次运行的时间和文件变更信息,如下:
{"name" : "job_name","lastrun" : "2024-02-21T07:55:58.851263972","indexed" : 0,"deleted" : 0
}

本地索引目录添加文件

fscrawler配置的每间隔1分钟进行一次文件同步操作,这里需要注意:
1、如果需要启动时将历史文件全量同步的话,需要在启动fscrawler之前就将文件放入settings.yaml配置字段 url对应的文件路径,我们配置的是/tmp/es,容器映射的文件目录是:/data/workspace/app/fscrawler/es

2、后续启动后创建了_status.json文件,文件里面的字段lastrun表示上次同步运行的时间,如果文件的修改时间在这个时间之前,是不会同步更新的,新增的文件修改时间必须是在这个时间之后才会同步。

在kibana验证同步效果(我的kibana 版本 8.8.1)

我在es目录下创建了多个格式的文件,包括txt、 doc、docx、ppt、pdf 和扫描件pdf 总共28个文件,文件目录如下:
在这里插入图片描述

在es中查看索引文档

  1. 在kibana创建可视化搜索应用,左侧菜单->Enterprise->Search Application;
    在这里插入图片描述

  2. 点击创建并选择下拉选择的索引,输入应用名称即可
    在这里插入图片描述
    在这里插入图片描述

  3. 展示效果,可以看到文件内容和文件类型,pdf的扫描件效果也不错。
    在这里插入图片描述

支持rest接口上传文件

启动时新增参数--rest 即可启动rest接口上传文件(注意:我本地为了测试方便使用--net=host -p 8080:8080 来映射主机端口到容器)

docker run -it --net=host -p 8080:8080 --rm \-v /data/workspace/app/fscrawler:/root/.fscrawler \-v /data/workspace/app/fscrawler/es:/tmp/es:ro \dadoonet/fscrawler fscrawler job_name --rest
  1. 启动后可以查看fscrawler 状态和配置
// http://127.0.0.1:8080/fscrawler{"ok": true,"version": "2.10-SNAPSHOT","elasticsearch": "8.8.1","settings": {"name": "job_name","fs": {"url": "/tmp/es","update_rate": "1m","excludes": ["*/~*"],"json_support": false,"filename_as_id": false,"add_filesize": true,"remove_deleted": true,"add_as_inner_object": true,"store_source": false,...
  1. 上传文件
~/workspace » echo "This is my text" > test.txt                                                                     
~/workspace » curl -F "file=@test.txt" "http://127.0.0.1:8080/fscrawler/_document"                                   ernestxwli@VM-142-118-tencentos
{"ok":true,"filename":"test.txt","url":"http://xxx.xxx.xxx.xxx:9200/job_name/_doc/dd18bf3a8ea2a3e53e2661c7fb53534"}%
  1. 上传文件并添加额外标签
    写入文件额外信息json到tags.txt, 内容如下{"external":{"tenantId": 24,"projectId": 34,"description":"these are additional tags"}}
curl -F "file=@test.txt" -F "tags=@tags.txt" "http://127.0.0.1:8080/fscrawler/_document"   
  1. 查看es索引文档信息
    在这里插入图片描述

可以看到业务可以根据自己的需要对文件进行字段扩展,以便满足业务需求, 当然还提供了其他接口来处理文件的删除等,详见官方文档。

总结

FSCrawler 提供了一站式的集成方案用来解决各种文档数据转化并存储到es数据库,也有一定的灵活性来自定义拓展字段,可以作为一种文档转换存储工具的选择之一。

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

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

相关文章

UniApp中实现微信分享功能:步骤详解与最佳实践

在现代移动开发中,分享功能已成为许多应用的标配。特别是在中国,微信作为最大的社交平台,其分享功能对于应用的推广和用户互动至关重要。本文将详细介绍如何在UniApp中实现微信分享功能,包括分享链接到微信好友,并显示…

进度条小程序

文章目录 铺垫回车换行缓冲区概述强制冲刷缓冲区 简单实现倒计时功能进度条小程序版本一实例代码效果展示分析 版本二 铺垫 回车换行 回车和换行是两个独立的动作 回车是将光标移动到当前行的最开始(最左侧) 换行是竖直向下平移一行 在C语言中&…

怿星科技测试实验室(EPT LABS)服务介绍

据中国汽车工业协会数据,2023年我国汽车产销量分别达3016.1万辆和3009.4万辆,年产销量双双创历史新高,汽车行业进入了新时代。新汽车时代下的OEM竞争更激烈,汽车电子架构更复杂,研发周期更短,软件迭代更快&…

VSCODE中使用Django处理后端data和data models

链接: Python and Django tutorial in Visual Studio Code MVC的理解 在实际的程序中采用MVC的方式进行任务拆分。 Model(模型)负责封装应用程序的数据和业务逻辑部分。Model包含数据结构,数据处理逻辑以及相关的操作方法&#…

NetSuite 中Inventory Adjustment批次物料CSV导入分析二

上一篇最后我们有一个遗留问题是说,调增和调减的操作是否能在一个CSV导入模版中进行操作,经过测试后发现,是可以的,只是External ID需要在设置的时候注意对应好就OK。这里建议大家先查看上一篇文章,因为有一些完全重复…

Day14-Linux系统基础权限知识精讲

Day14-Linux系统基础权限知识精讲 1. chattr2. Linux系统权限。2.1 基础权限介绍2.2 画图讲解2.3 文件和目录权限细节总结2.4 建环境测试2.5 数字权限设置2.6 字符权限设置 给文件加特殊属性,实现特殊功能的命令。 1. chattr a 只能追加内容,不能删除。…

UE蓝图 入口(FunctionEntry)节点和源码

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 UE蓝图 入口(FunctionEntry)节点和源码 文章目录 系列文章目录一、FunctionEntry节点功能二、入口节点用法1. 创建函数2. 命名函数3. 定义参数4. 编写函数逻辑5…

Git合并固定分支的某一部分至当前分支

在 Git 中,通常使用 git merge 命令来将一个分支的更改合并到另一个分支。如果你只想合并某个分支的一部分代码,可以使用以下两种方法: 1.批量文件合并 1.1.创建并切换到一个新的临时分支 首先,从要合并的源分支(即要…

C++面向对象程序设计-北京大学-郭炜【课程笔记(四)】

C面向对象程序设计-北京大学-郭炜【课程笔记(四)】 1、this指针1.1、this指针的作用1.2、this指针和静态成员函数 2、静态成员变量和静态成员函数2.1、基本概念2.2、基本概念总结2.3、如何访问静态成员2.4、静态成员变量的使用场景(重要&…

Qt中常见的JS类和函数(一)

相关系列文章 Qt中字符串转换为JS的函数执行 目录 1.引言 2.全局对象(The Global Object) 2.1.值属性(Value Properties) 2.1.1.NaN 2.1.2.Infinity 2.1.3.undefined 2.2.函数属性(Function Properties) 2.2.1.eval(x) 2.2.2.parseInt(string, radix) 2.2.3.parseFl…

浏览器---浏览器/http相关面试题

1.localStorage和sessionStorage 共同点:二者都是以key-value的键值对方式存储在浏览器端,大小大概在5M。 区别: (1)数据有效期不同:sessionStorage仅在当前浏览器窗口关闭之前有效;localStorag…

wps电子表格(xlsx)在excel打开时,多余图形(shapes)的处理

背景: 1. win10, excel 打开 wps 生成的 xlsx文档; 2. 文档中有多余的图形,经检测为shape大类; 3. 文档中可见的图形可以全选后删除; 但是不可见部分仍然存在; 4. vba删除时,可以直接循环删除&#xff…

Eigen:Vector3d 变量初始化遇到的问题

Eigen:Vector3d 变量初始化遇到的问题 2024.2.22 日 ,在使用 Eigen:Vector3d 这个类型的 变量,在类中进行初始化时 遇到了如下问题: 首先在类的声明内部,是不能声明完,再给变量赋值的,不管是 Eigen:Vector…

【 Flutter】安装、运行坑记录

运行demo报错 Exception in thread “main” java.net.ConnectException: Connection timed out: connect原因:网络问题,gradle包未能下载 解决方案:配置android studio代理,重新打开项目,as会自动下载缺失依赖

(done) 如何判断一个矩阵是否可逆?

参考视频:https://www.bilibili.com/video/BV15H4y1y737/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 这个视频里还暗含了一些引理 1.若 AX XB 且 X 和 A,B 同阶可逆,那么 A 和 B 相似。原因&#xff1…

服务器防火墙的应用技术有哪些类型?

随着互联网的发展,网络安全问题更加严峻。服务器防火墙技术作为一种基础的网络安全技术,对于保障我们的网络安全至关重要。本文将介绍服务器防火墙的概念和作用,以及主要的服务器防火墙技术,包括数据包过滤、状态检测、代理服务、…

安卓开发:挑战每天发布一个封装类02--Wav录音封装类AudioChannel 1.0

简介 库名称:AudioChannel 版本:1.0 由于项目需求录音并base64编码存到服务器中,就顺手改装了一个别人的封装类 原封装类地址:Android AudioRecord音频录制wav文件输出 - 简书 (jianshu.com) 描述:此封装类基于AudioRecord实现wav的音频…

Springcloud OpenFeign 的实现(二)

Springcloud OpenFeign 的实现(一) 一、Feign request/response 压缩 您可以考虑为您的外部请求启用请求或响应GZIP压缩。您可以通过启用以下属性之一来完成此操作: feign.compression.request.enabledtrue feign.compression.response.en…

WEB相关工具(wget、curl、ab)

目录 一、wget 1、wget基本语法 2、wget帮助的更多选项 二、curl 1、curl基本语法 2、curl命令下载 3、curl命令基本用法 3.1 curl伪装 3.2 提取状态码 3.3 提取本地IP地址 3.4 提取远端服务器IP地址 3.5 提取本地端口 3.6 提取远端服务器端口 三、压力测试工具…

K8S NFS持久存储配置

K8S NFS持久存储配置 在Kubernetes(K8S)中配置NFS(Network File System)作为持久存储通常涉及以下步骤: 1. 准备NFS服务器 首先,你需要一个运行NFS服务的服务器。这可以是Kubernetes集群中的一个节点&am…