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

news2024/12/23 22:12:13

需求背景

最近有一个需求需要建设一个知识库文档检索系统,这些知识库物料附件的文档居多,有较多文档格式如: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 # 是否支持json
  filename_as_id: false # 是否将文件名作为id
  add_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 # 是否支持xml
  index_folders: true # 是否索引文件夹
  lang_detect: false # 是否检测语言
  continue_on_error: false # 是否继续错误
  add_as_inner_object: true # 是否将文件内容作为内部对象
  ocr:
    language: "chi_sim+eng" # 识别语言
    enabled: true # 是否启用ocr
    pdf_strategy: "ocr_and_text" # pdf策略
  follow_symlinks: false # 是否跟随符号链接
elasticsearch:
  nodes:
  - url: "http://xxx.xxx.xxx.xxx:9200"
  username: xxx
  password: xxxx
  bulk_size: 100
  flush_interval: "5s"
  byte_size: "10mb"
  ssl_verification: true
  push_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_name
   
02: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.coloradmin.cn/o/1460958.html

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

相关文章

YOLO-World:实时开放词汇目标检测

paper:https://arxiv.org/pdf/2401.17270.pdf Github:GitHub - AILab-CVC/YOLO-World: Real-Time Open-Vocabulary Object Detection online demo:https://huggingface.co/spaces/stevengrove/YOLO-World 目录 0. 摘要 1. 引言 2. 相关工…

解决docker中运行的jar包连不上数据库

目录 数据库主机地址设置问题: 网络连接问题: 数据库端口映射: 数据库认证问题: 数据库服务是否正常运行: 日志查看: 如果在 Docker 中运行的 JAR 包无法连接到数据库,有几个可能的原因和…

优秀自媒体工作者常用的7款ai写作工具! #AI写作#AI写作

我们做自媒体运营,想要快速的创作内容,提供文章的创作速度是我们的目标,我们别的大佬可以很快地就创作出一篇内容,而自己墨迹半天确出不了一个字呢?其实这关乎到创作技巧,下面小编就跟大家分享如何利用自媒…

Linux的Ubuntu的APT使用

Linux的Ubuntu的APT使用 apt 介绍 apt 是 Advanced Packaging Tool 的简称,是一款安装包管理工具。在 Ubuntu 下,我们可以使用 apt 命令进行软件包的安装、删除、清理等,类似于 Windows 中的软件管理工具。 Ubuntu 软件操作的相关命令 su…

SD-WAN专线:助力企业海外社交媒体推广

随着全球化的发展,越来越多的企业将目光投向海外市场,而在海外市场推广中,社交媒体平台成为了一个重要的推广渠道。然而,很多企业在海外社交媒体推广过程中都会遇到网络问题,传统的VPN解决方案往往存在IP被封、网络不稳…

32单片机基础:GPIO输入

1.1按键控制LED 按键介绍: 两种方式,我们一般用下接的方式。 第一个图:注意点。当按键按下,PA0接地,被置为低电平, 但是一旦按键松手,PA0悬空,引脚电压不确定。所以无论怎么读引脚…

MySQL 核心模块揭秘 | 06 期 | 事务提交之前,binlog 写到哪里?

1. 准备工作 参数配置: binlog_format ROW binlog_rows_query_log_events OFF创建测试表: CREATE TABLE t_binlog (id int unsigned NOT NULL AUTO_INCREMENT,i1 int DEFAULT 0,str1 varchar(32) DEFAULT ,PRIMARY KEY (id) USING BTREE ) ENGINEIn…

使用 Nuxt 构建简单后端接口及数据库数据请求

写在前面 本文主要为大家介绍,如何使用 Nuxt 框架实现一个简单的后端接口,并且从数据库中请求数据返回给前端。 实现 创建 serverMiddleware 文件夹 首先我们新建一个名字为 serverMiddleware 文件夹用来存储接口相关信息 目录结构如下:…

探索 JavaScript ES8 中的函数式编程并通过实例加以实践

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 介绍 函数式编程是一种强大的范式&#xff0c…

【buuctf--outguess】

看题目就知道应该要用到 outguess 这个工具了,具体用处和下载方式请参照这篇博客Outguess下载和使用方法_outguess工具-CSDN博客 下载的 tar 压缩包解压,huhuhu.zip是伪加密的,直接用 binwalk -e 提取一下就可以,也可以修改压缩源…

python游戏代码大全可复制,python基础游戏代码

本篇文章给大家谈谈python游戏编程入门游戏代码,以及python游戏代码大全可复制,希望对各位有所帮助,不要忘了收藏本站喔。 仅限技术学习参考 分享13个游戏源码,可以自己复现玩玩,研究下里面的编程逻辑,对学…

PMP考试难度怎么样?

PMP考试整体难度并不大,因为目前的考试题型都是选择题,所以通过率相对较高。然而,新考纲中增加了更多关于敏捷方法的题型,这些题目相对更加变化多样,也有不少考生觉得难以抉择,四个选项都似乎都是正确的。P…

电商数据采集+跨境电商|API电商数据采集接口洞悉数字新零售发展

随着全球经济一体化和电子商务的快速发展,网络购物的需求日益增加。不断涌现的电商企业使得行业的竞争情况愈演愈烈。在这种情况下,企业不仅要加大经营力度,还要在自己的基础设施和技术上持续投入,才能更好的适应市场和消费习惯。…

开源CMS Drupal本地快速部署并实现无公网ip环境远程访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS,适用于各种不同的网站项目,从小型个人博客到大型企业级门户网站。它的学习…

TP4366 1A 低成本 天源 同步移动电源方案 SOP-8

描述 TP4366是一款专为移动电源设计的同步升压的单芯片解决方案,内部集成了线性充电管理模块、同步放电管理模块、电量检测与LED指示模块、保护模块。TP4366内置充电与放电功率MOS,充电电流固定为0.8A,同步升压支持1A 输出电流。TP4366内部集成了温度补偿、过温保护、过充与过…

MySQL数据库基础(十二):子查询(三步走)

文章目录 子查询(三步走) 一、子查询(嵌套查询)的介绍 二、子查询的使用 三、总结 子查询(三步走) 一、子查询(嵌套查询)的介绍 在一个 select 语句中,嵌入了另外一个 select …

数据结构与算法:栈

朋友们大家好啊,在链表的讲解过后,我们本节内容来介绍一个特殊的线性表:栈,在讲解后也会以例题来加深对本节内容的理解 栈 栈的介绍栈进出栈的变化形式 栈的顺序存储结构的有关操作栈的结构定义与初始化压栈操作出栈操作获取栈顶元…

基于springboot实现的音乐网站

一、系统架构 前端:html | js | css | bootstrap 后端:springboot | mybatis 环境:jdk1.8 | mysql | maven 二、 代码及数据库 三、功能介绍 01. 登录页 02. 用户注册 03. 首页 04. 喜欢 05. 查询

以程序员的视角,看前后端分离的是否必要?

Hello,我是贝格前端工场,本篇分享一个老生常谈的话题,前后端分离是必然趋势,但也是要区分具体的场景,欢迎探讨,关注,有前端开发需求可以私信我,上车了。 一、什么是前后端分离和不分…

【dc-dc】世微AP5125 外置MOS 5-100V 8A平均电流型LED降压恒流驱动器 SOT23-6

产品描述 AP5125 是一款外围电路简单的 Buck 型平均电流检测模式的 LED 恒流驱动器,适用于 8-100V 电压范围的非隔离式大功率恒流 LED 驱动领域。芯片采用固定频率 140kHz 的 PWM 工作模式, 利用平均电流检测模式,因此具有优异的负载调整 率特…