我有一个包含多个重复条目的索引。它们具有不同的 id,但其他字段具有相同的内容。
例如:
{id: 1, content: 'content1'}
{id: 2, content: 'content1'}
{id: 3, content: 'content2'}
{id: 4, content: 'content2'}
删除重复项后:
{id: 1, content: 'content1'}
{id: 3, content: 'content2'}
有没有一种方法可以删除所有重复项并仅保留一个不同的条目,而无需手动比较所有条目?
这可以通过多种方式来完成。下面我概述了两种可能的方法:
1)如果你不介意生成新的_id
值并将所有文档重新索引到一个新集合中,然后您可以使用 Logstash 和指纹 https://www.elastic.co/guide/en/logstash/current/plugins-filters-fingerprint.html过滤器从您尝试去重复的字段生成唯一的指纹(哈希),并使用该指纹作为_id
用于将文档写入新集合中。自从_id
字段必须是唯一的,任何具有相同指纹的文档都将写入相同的指纹_id
并因此进行重复数据删除。
2)您可以编写一个在索引上滚动的自定义脚本。阅读每个文档时,您可以根据您认为定义唯一文档的字段创建一个哈希(在您的情况下,content
场地)。然后使用这个散列作为字典(也称为散列表)中的键。与此键关联的值将是文档的所有内容的列表_id
生成相同哈希值的 s。一旦你拥有了所有的哈希值和相关的列表_id
s,您可以对除其中一个之外的所有对象执行删除操作_id
与每个相同的哈希相关联。请注意,第二种方法不需要将文档写入新索引来消除重复,因为您可以直接从原始索引中删除文档。
我写了一篇博客文章和代码,在以下 URL 中演示了这两种方法:https://alexmarquardt.com/2018/07/23/deduplicate-documents-in-elasticsearch/ https://alexmarquardt.com/2018/07/23/deduplicating-documents-in-elasticsearch/
免责声明:我是 Elastic 的一名咨询工程师。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)