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 "[email protected]" "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 "[email protected]" \
  -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进阶助手

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

相关推荐
Elasticsearch12 分钟前
Elastic Security 简化了预构建 SIEM 检测规则的自定义
elasticsearch
春风不会绿大地21 分钟前
Flink+Hologres搭建实时数仓
大数据·flink
舒一笑1 小时前
一文简单记录打通K8s+Kibana流程如何启动(Windows下的Docker版本)
后端·elasticsearch·kibana
董可伦1 小时前
Flink HA 总结
大数据·flink
不爱学英文的码字机器3 小时前
数字孪生的浪潮:从虚拟镜像到现实世界的 IT 变革
大数据·python
kaamelai3 小时前
Kaamel视角下的MCP安全最佳实践
大数据·人工智能·安全
anqi273 小时前
如何在 IntelliJ IDEA 中编写 Speak 程序
java·大数据·开发语言·spark·intellij-idea
互联科技报4 小时前
孙宇晨将出席迪拜Token2049 与特朗普次子共话加密未来
大数据
LaughingZhu4 小时前
PH热榜 | 2025-04-24
运维·经验分享·搜索引擎·产品运营·jenkins
科技小E4 小时前
EasyRTC嵌入式音视频通信SDK智能安防与监控系统的全方位升级解决方案
大数据·网络·人工智能·音视频