【问题标题】:Elasticsearch: Remove duplicates from indexElasticsearch:从索引中删除重复项
【发布时间】:2018-07-28 02:18:48
【问题描述】:

我有一个包含多个重复条目的索引。它们具有不同的 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'}

有没有办法删除所有重复项并只保留一个不同的条目而不手动比较所有条目?

【问题讨论】:

  • 使用您自己的 id 来确保幂等性。这意味着对于内容:“content1”,您应该始终拥有相同的 id
  • 但对我来说不是这样。我正在使用给定的索引。在这个索引中有多个单独的条目,它们包含相同的内容。因此,我想删除这些重复项。
  • 您的content 字段是如何映射的?那是stringanalyzednot_analyzed吗?
  • 您可以创建另一个以内容为 id 的索引。然后通过快照/恢复或扫描和滚动将现有索引迁移到新索引
  • 首先是什么导致重复条目?

标签: elasticsearch


【解决方案1】:

这可以通过多种方式实现。下面我概述了两种可能的方法:

1) 如果您不介意生成新的 _id 值并将所有文档重新索引到新集合中,那么您可以使用 Logstash 和 fingerprint 过滤器从字段中生成唯一指纹(哈希)您正在尝试删除重复数据,并在将文档写入新集合时将此指纹用作_id。由于_id 字段必须是唯一的,因此任何具有相同指纹的文档都将写入相同的_id 并因此进行重复数据删除。

2) 您可以编写一个自定义脚本来滚动您的索引。在读取每个文档时,您可以从您考虑定义唯一文档的字段创建哈希(在您的情况下,content 字段)。然后在他们键入字典(又名哈希表)时使用此哈希。与此键关联的值将是生成此相同哈希的所有文档_ids 的列表。一旦您拥有_ids 的所有散列和关联列表,您可以对与每个相同散列关联的_ids 中的一个以外的所有_ids 执行删除操作。请注意,第二种方法不需要将文档写入新索引来进行重复数据删除,因为您会直接从原始索引中删除文档。

我写了一篇博文和代码,在以下 URL 上演示了这两种方法:https://alexmarquardt.com/2018/07/23/deduplicating-documents-in-elasticsearch/

免责声明:我是 Elastic 的一名咨询工程师。

【讨论】:

    【解决方案2】:

    我使用 Rails,如有必要,我将使用 FORCE=y 命令导入内容,该命令会删除并重新索引该索引和类型的所有内容...但是不确定您在什么环境中运行 ES。唯一的问题我可以查看您要从中导入的数据源(即数据库)是否有重复记录。我想我会先看看数据源是否可以修复,如果可行,然后重新索引所有内容;否则,您可以尝试创建一个自定义导入方法,该方法仅索引每条记录的重复项之一。

    此外,我知道这不符合您想要删除重复条目的要求,但您可以简单地自定义您的搜索,以便您只返回一个重复的 ID,无论是通过最近的“时间戳”还是索引去重数据和按内容字段分组——看看this post helps。尽管这仍然会在您的索引中保留重复记录,但至少它们不会出现在搜索结果中。

    我也发现了这个:Elasticsearch delete duplicates

    我尝试为您考虑许多可能的情况,看看这些选项中的任何一个是否有效,或者至少可以临时修复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多