Elasticsearch FSCrawler 一个bug及解决方案

1、FSCrawler Bug 发现过程及描述

书接上一回,在使用 Elasticsearch FSCrawler 实现文档知识库检索的时候。

发现基于本地磁盘文件轮询导入 Elasticsearch 都没有问题。

但是,借助其 REST API 接口上传文件的时候,发现其字段 filesize 字段没有值。

但,实际业务场景中,需要展示这个字段。

这样导致的结果是,页面无法显示,而后发现是因为字段缺失所致。

2、FSCrawler Bug 排查思路

2.1 核查 Mapping 看是否字段缺失

go 复制代码
GET fs_job_2024/_mapping

Mapping 部分映射如下:

go 复制代码
"filename": {
    "type": "text",
    "store": true,
    "fields": {
      "keyword": {
        "type": "keyword"
      }
    },
    "analyzer": "ik_smart"
  },
  "filesize": {
    "type": "long"
  },
  "indexed_chars": {
    "type": "long"
  },

我们想要的字段 filesize 是存在的。

初步判定 Mapping 没有问题。

2.2 查看历史文档看 filesize 值是否合理

go 复制代码
POST fs_job_2024/_search
{
  "_source": [
     "file.filesize"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "file.filesize"
          }
        }
      ]
    }
  }
}

执行后看召回结果:

也就是说,已有通过轮询写入 Elasticsearch 集群的文档数据都没有问题。

2.3 python 代码写入文档就会没有 filesize 字段

多次测试发现,只要借助 python Http 请求写入的字段就没有 filesize 字段。

然后,再继续核查官方文档,这方面给出了 CURL 的示例。

https://fscrawler.readthedocs.io/en/latest/admin/fs/rest.html

go 复制代码
echo "This is my text" > test.txt
curl -F "file=@test.txt" "http://127.0.0.1:8080/fscrawler/_document"

结果参照执行后,也发现提交的文档没有 filesize 字段。这样之后,我就 Elasticsearch 论坛提交了问题。

https://discuss.elastic.co/t/fscrawler-rest-service-has-no-filesize-field/358630/2

作者响应很及时,并认定这是一个 bug。

反馈如下:

https://github.com/dadoonet/fscrawler/pull/1868

3、FSCrawler Bug 解决方案

期间和作者有过几轮沟通和验证后,最终得出解决方案。

go 复制代码
echo "This is my text" > test.txt
curl -F "file=@test.txt" \
  -F "tags={\"file\":{\"filesize\":$(ls -l test.txt | awk '{print $5}')}}" \
  "http://127.0.0.1:8080/fscrawler/_document"

就是写入的时候加上"Additional tags"。这个命令通常用于向支持文件接收的服务发送文件,并同时提供一些元数据(在这里是文件的大小)。

也就是说需要咱们自己提交一下文件的大小。

如下是我 python 代码最终解决方案:

go 复制代码
# 获取文件大小
file.seek( 0, os.SEEK_END )
file_size = file.tell()
file.seek( 0 )  # 重置文件指针

# 打印文件大小,用于调试
print( "File size:", file_size )

# 构建文件上传部分
files = {'file': (
file.filename, file, 'application/vnd.openxmlformats-officedocument.wordprocessingml.document')}

# 构建 tags 部分,包含文件大小等信息
tags = {'file': {'filesize': file_size}}

# 发送文件和表单数据到指定地址
response = requests.post(
    FS_WEB_ADDRESS,
    files=files,
    data={'tags': json.dumps( tags )},  # 使用 json.dumps 将字典转换为 JSON 字符串
    timeout=10
)

这样所有新文档的提交都有 filesize 值了。

4、小结

本文详细描述发现 FSCrawler bug 的全过程。欢迎留言就 FSCrawler 相关技术问题进行交流。

PS:要用如下截图最新版本的包来验证才可以修复bug。


Elasticsearch FSCrawler 文档爬虫学习,请先看这一篇!

新时代写作与互动:《一本书讲透 Elasticsearch》读者群的创新之路

更短时间更快习得更多干货!

和全球 超2000+ Elastic 爱好者一起精进!

elastic6.cn------ElasticStack进阶助手

比同事抢先一步学习进阶干货!

相关推荐
五度易链-区域产业数字化管理平台几秒前
十五五规划明确数智方向数字经济将迎新变化,五度易链大数据、AI技术如何从单点应用走向全域赋能
大数据·人工智能
zhongerzixunshi2 分钟前
高新技术企业认定成功后,企业能享受哪些政策优惠
大数据·人工智能
小王不爱笑13218 分钟前
Git 从初始化到远程推送完整实操笔记
大数据·elasticsearch·搜索引擎
数据皮皮侠1 小时前
政府创新采购数据库(2016-2024)
大数据·数据库·人工智能·制造·微信开放平台
综合热讯1 小时前
泛微发布数智业财融合创新方案,AI驱动组织构建“业·财·票·税·档”一体化
大数据·人工智能
安科瑞小许1 小时前
高校宿舍电气安全新防线:浅析电气防火限流式保护技术
大数据·人工智能·安全·防火灾·限电流保护
管理大亨1 小时前
Elasticsearch + Logstash + Filebeat + Kibana + Redis架构
redis·elasticsearch·架构
神算大模型APi--天枢6461 小时前
从异构调度到边缘部署:国产大模型算力平台的后端开发能力拆解
大数据·人工智能·科技·架构·硬件架构
Jackyzhe1 小时前
Flink学习笔记:反压
大数据·flink