
Elasticsearch 删除重复文档实现方式,你知道几个?
之前文章有讲到借助:fingerprint filter 插件实现去重。
近期又有社群小伙伴问到同样的问题,这里一并梳理回复如下。
1、python 脚本实现文档去重
这里讲的实现,借助 python 脚本实现。
- 前置条件:
由于涉及 8.X 版本 Elasticsearch 以安全方式的连接,这里需要 python 升级到 3.10+ 版本才可以。
1.1 实现前提
标定文档重复标记——一般文档中几个字段或者全部字段重复,才认为文档是一样的。
业务层面自己指定就可用 md5
值实现。
对于新闻类类线上业务的文档举例:
- 网易新闻
https://3g.163.com/news/article/H5APDMGH00019UD6.html
- 新浪新闻
https://news.sina.com.cn/sx/2022-04-19/detail-imcwiwst2726757.shtml
如果拿文章标题(title) + 正文内容(content)内容组合取 md5,然后对比的话,两者发布网站不同,但内容可以认为是重复的。
1.2 实现原理
- Step 1:scan遍历全部文档,生成文档 md5。
- Step2:生成字典,字典两部分组成,md5 值是 key,value 是一个数组,里面存的是文档id。
- Step3:遍历字典的value部分大于1的值,就代表存在重复文档。
- Step4:删除重复文档。
2、实现代码
码的核心:
使用了 8.X 版本的 Elasticsearch 访问方式。借助:fingerprint 访问实现。
fingerprint 两种获取方式:
方式一:Elasticsearch 启动的时候已经包含。
方式二:可以借助命令行再生成。
3、小结
文章给出 8.X 版本实现文档去重的完整思路和Python 代码实现,加上之前讲解的 logstash fingerprint filter 插件实现去重实现,共2种方案解决文档重复问题。
你的项目实战环节有没有遇到文档去重问题、删除重复文档问题?如何解决的?欢迎留言交流。
参考
https://github.com/deric/es-dedupe/blob/master/esdedupe/esdedupe.py
https://github.com/alexander-marquardt/deduplicate-elasticsearch
https://alexmarquardt.com/2018/07/23/deduplicating-documents-in-elasticsearch/
文章转载自公众号:铭毅天下Elasticsearch
