Elasticsearch 删除重复文档实现方式,你知道几个?

这篇具有很好参考价值的文章主要介绍了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

Elasticsearch 删除重复文档实现方式,你知道几个?

如果拿文章标题(title) + 正文内容(content)内容组合取 md5,然后对比的话,两者发布网站不同,但内容可以认为是重复的。

1.2 实现原理

  • Step 1:scan遍历全部文档,生成文档 md5。

  • Step2:生成字典,字典两部分组成,md5 值是 key,value 是一个数组,里面存的是文档id。

  • Step3:遍历字典的value部分大于1的值,就代表存在重复文档。

  • Step4:删除重复文档。

2、实现代码

#!/usr/local/bin/python3
from elasticsearch import Elasticsearch, helpers
import hashlib
import ssl

# 全局变量
ES_HOST = 'https://192.168.1.10:9200'
ES_USER = 'elastic'
ES_PASSWORD = '9Z=T2wOWIXXXXXXXX'
CERT_FINGERPRINT = "a4d0fe1eb7e1fd9874XXXXXXXXXX"

# 全局词典
dict_of_duplicate_docs = {}

# https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/config.html
# 要求python 版本3.10及以上
# fingerprint 生成方式,方式一:Elasticsearch 首次启动的时候自动生成。
# 方式二:借助命令行再次生成(结果同方式一)
# bash-4.2$ openssl x509 -fingerprint -sha256 -in config/certs/http_ca.crt
# SHA256 Fingerprint=A4:D0:FE:1E:B7:E1:FD:98:74:A4:10:6F:E1:XXXXXXXX
def es_init():
    es = Elasticsearch( ES_HOST,
    ssl_assert_fingerprint=CERT_FINGERPRINT,
    basic_auth=(ES_USER, ES_PASSWORD),
    verify_certs=False )
    return es
    
# 对每个文档生成唯一id(自定义生成)
def populate_dict_of_duplicate_docs(hit):
    combined_key = ""
    
    # 三个字段决定索引是否重复,自动是根据业务指定的
    keys_to_include_in_hash = ["CAC", "FTSE", "SMI"]
    for mykey in keys_to_include_in_hash:
      combined_key += str(hit['_source'][mykey])
      
      _id = hit["_id"]
      
      # 基于三个字段的组合,生成md5值,便于后续去重用。
      hashval = hashlib.md5(combined_key.encode('utf-8')).digest()
      
      # 生成键值对词典,key使用md5值,value 为数组类型。
      # 相同的 key 值也就是相同的文档,value 是文档id列表
      dict_of_duplicate_docs.setdefault(hashval, []).append(_id)
      print(dict_of_duplicate_docs)
      
  
  # 待去重索引遍历
  def scroll_over_all_docs():
      es = es_init()
      for hit in helpers.scan(es, index='stocks'):
        populate_dict_of_duplicate_docs(hit)
        
    # 去重处理函数
    def loop_over_hashes_and_remove_duplicates():
      es = es_init()
      for hashval, array_of_ids in dict_of_duplicate_docs.items():
      # 对id列表长度大于1的做去重处理操作
      if len(array_of_ids) > 1:
      print(" Duplicate docs hash=%s ****" % hashval)
      # 获取相同的文档
      matching_docs = es.mget(index="stocks", ids= array_of_ids[0:len(array_of_ids)-1])
      for doc in matching_docs['docs']:
        print("doc=%s\n" % doc)
        es.delete(index="stocks", id = doc['_id'])
        
def main():
    scroll_over_all_docs()
    loop_over_hashes_and_remove_duplicates()
    
main()

代码的核心:

使用了 8.X 版本的 Elasticsearch 访问方式。借助:fingerprint 访问实现。

fingerprint 两种获取方式:

方式一:Elasticsearch 启动的时候已经包含。

Elasticsearch 删除重复文档实现方式,你知道几个?

方式二:可以借助命令行再生成。

openssl x509 -fingerprint -sha256 -in config/certs/http_ca.crt

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/

推荐阅读

  1. 如何从0到1打磨一门 Elasticsearch 线上直播课?

  2. 重磅 | 死磕 Elasticsearch 方法论认知清单(2021年国庆更新版)

  3. 如何系统的学习 Elasticsearch ?

  4. fingerprint filter 插件——Elasticsearch 去重必备利器

  5. Elasticsearch6.X 去重详解

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

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

Elasticsearch 删除重复文档实现方式,你知道几个?

比同事抢先一步学习进阶干货!文章来源地址https://www.toymoban.com/news/detail-402139.html

到了这里,关于Elasticsearch 删除重复文档实现方式,你知道几个?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch-索引和文档的创建修改删除

    目录 一、创建索引 二、查看索引 三、索引是否存在 四、删除索引 五、创建文档 六、查看文档 七、更新文档 八、文档是否存在 九、删除文档 结果: 语法: GET 索引名称  从这两个索引信息来看,es_db2是标准分词器的索引,es_db3是ik分词器索引。 语法:HEAD 索引名称    在

    2024年01月19日
    浏览(42)
  • Elasticsearch如何创建索引,添加,删除,更新文档

    了解es基本概念:elasticsearch(es)背景故事与基本概念 安装es:Linux安装Elasticsearch详细教程 安装kibana:Linux安装Kibana详细教程 熟悉Json 熟悉REST接口 检查 es 及 Kibana 是否运行正常 创建一个名为 twitter 的索引(index),并插入一个文档(document) 在关系型数据库中,需要使用DDL语

    2023年04月08日
    浏览(64)
  • SpringBoot+Elasticsearch使用resthighlevelclient对象删除指定的文档数据

    使用客户端删除 在 Kibana 中,你可以使用 Dev Tools 或者 Console 来执行 Elasticsearch 查询和删除操作。 ​ 以下是一个使用 Dev Tools 执行删除文档的示例: ​ 1.打开 Kibana,转到左侧导航栏的 “Dev Tools” 或者 “Console”。 ​ 2.在 Dev Tools 或者 Console 中输入如下删除请求: 请替换 /

    2024年01月23日
    浏览(48)
  • C语言实现删除字符串中重复字符的算法

    C语言实现删除字符串中重复字符的算法 问题描述: 给定一个字符串,我们需要编写一个C语言函数,以删除字符串中的重复字符。例如,对于输入字符串\\\"hello world\\\",函数应该返回\\\"hel wrd\\\"。 算法思路: 为了解决这个问题,我们可以使用一个哈希表来跟踪每个字符的出现次数。

    2024年02月04日
    浏览(43)
  • 【安全】Java幂等性校验解决重复点击(6种实现方式)

    1.1 什么是幂等? 幂等 是一个数学与计算机科学概念,英文 idempotent [aɪˈdempətənt]。 在数学中,幂等用函数表达式就是: f(x) = f(f(x)) 。比如 求绝对值 的函数,就是幂等的,abs(x) = abs(abs(x))。 计算机科学中,幂等表示 一次和多次请求某一个资源应该具有同样的作用 。 满足幂

    2024年02月05日
    浏览(126)
  • 搜索引擎语法大全,你知道几个?

    网络安全重磅福利:入门进阶全套282G学习资源包免费分享! 基本语法 1、define 搜索某个词的定义 例如: 搜索:define:38.5,将返回关于“38.5”的定义。 2、define 搜索某个词的定义 例如: 搜索:define:38.5,将返回关于“38.5”的定义。 网络安全重磅福利:入门进阶全套282G学习资源包

    2024年02月03日
    浏览(48)
  • 你不知道的几个JavaScript 高阶技巧

    基础: 高阶: 基础: 高阶: 基础: 高阶: 基础: 高阶: 基础: 高阶: 基础: 高阶: 基础: 高阶: 基础 高阶 更简单的方法: null 是一个  value ,然而 undefined 不是. null 像一个空盒子,但 undefined 不是. 传递 null 时, 不采用 默认值。然而,当未定义或未传递任何内容时,

    2024年02月08日
    浏览(52)
  • ZBrush软件这些实用小技巧,你知道几个?

    ZBrush软件是世界上第一个让艺术家感到无约束自由创作的 3D 设计工具,它的出现完全颠覆了过去传统三维设计工具的工作模式,解放了艺术家们的双手和思维,告别过去那种依靠鼠标和参数来笨拙创作的模式,完全尊重设计师的创作灵感和传统工作习惯。 它将三维动画中间

    2024年02月05日
    浏览(44)
  • 必知必备的 Linux 术语,你知道几个?

    什么是发行版?交换性是什么意思?Xen 和 KVM 有何不同?初学者必须掌握基本的 Linux 术语。 Linux 操作系统是一个开源、社区开发的计算机和服务器操作系统,是使用最广泛和支持最广泛的操作系统之一。它管理硬件资源和应用程序,并提供用户界面供管理员和开发人员使用

    2024年02月07日
    浏览(25)
  • 人工智能的八大关键技术,你知道几个?

    随着科技的不断发展,人工智能成为当今社会热门的话题之一。在人工智能领域中,有许多关键技术正在不断突破和演进,为人类带来了前所未有的机遇和挑战。这些关键技术,如机器学习、深度学习、计算机视觉、自然语言处理等,不仅在科技领域取得了重大突破,还广泛

    2024年01月15日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包