【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,一经查实,立即删除!

相关文章

进度条小程序

文章目录 铺垫回车换行缓冲区概述强制冲刷缓冲区 简单实现倒计时功能进度条小程序版本一实例代码效果展示分析 版本二 铺垫 回车换行 回车和换行是两个独立的动作 回车是将光标移动到当前行的最开始(最左侧) 换行是竖直向下平移一行 在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、静态成员变量的使用场景(重要&…

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

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

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的音频…

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 提取远端服务器端口 三、压力测试工具…

Unity xLua开发环境搭建与基础进阶

Unity是一款非常流行的游戏开发引擎,而xLua是一个为Unity开发者提供的Lua框架,可以让开发者使用Lua语言来进行游戏开发。在本文中,我们将介绍如何搭建Unity xLua开发环境,并进行基础进阶的学习。 环境搭建 首先,我们需…

高维数据的中介效应【中介分析】《R包:HIMA》

允许基于高级中介筛选和惩罚回归技术来估计和测试高维中介效应 Hima包浏览 高维中介示意图 图1. 在暴露和结果之间有高维中介的情况 本包的作用 在确定独立筛选和极小极大凹惩罚技术的基础上,采用联合显著性检验方法对调解效果进行检验。使用蒙特卡罗模拟研究来展…

Python爬虫实战入门:爬取360模拟翻译(仅实验)

文章目录 需求所需第三方库requests 实战教程打开网站抓包添加请求头等信息发送请求,解析数据修改翻译内容以及实现中英互译 完整代码 需求 目标网站:https://fanyi.so.com/# 要求:爬取360翻译数据包,实现翻译功能 所需第三方库 …

2024什么样的大路灯比较好?5大爆款落地灯推荐必看!

大路灯作为一个可以照明,让室内环境光线更加舒适的电器,能够减少用眼时不良光线带来的疲劳感,营造接近自然光的舒适光,受到很多家长的关注! 但现在市面有很多不良商家推出的大路灯虚标参数,实际护眼性能很低…

线性代数:向量空间

目录 向量空间 Ax 0 的解空间S Ax b 的全体解向量所构成集合不是向量空间 基、维数、子空间 自然基与坐标 例1 例2 向量空间 Ax 0 的解空间S Ax b 的全体解向量所构成集合不是向量空间 基、维数、子空间 自然基与坐标 例1 例2

vue中使用AraleQRCode生成二维码

vue中使用AraleQRCode生成二维码 问题背景 本文介绍vue中生成二维码的一种方案&#xff0c;使用AraleQRCode来实现。 问题分析 &#xff08;1&#xff09;安装对应的依赖包 npm i arale-qrcode --save &#xff08;2&#xff09;完整代码如下: <template><!-…