我有一个包含多个重复条目的索引.它们具有不同的ID,但其他字段具有相同的内容.
例如:
{id: 1, content: 'content1'}
{id: 2, content: 'content1'}
{id: 3, content: 'content2'}
{id: 4, content: 'content2'}
Run Code Online (Sandbox Code Playgroud)
删除重复项后:
{id: 1, content: 'content1'}
{id: 3, content: 'content2'}
Run Code Online (Sandbox Code Playgroud)
有没有办法删除所有重复项并只保留一个不同的条目而无需手动比较所有条目?
这可以通过多种方式实现。下面我概述了两种可能的方法:
1) 如果您不介意生成新_id值并将所有文档重新索引到新集合中,那么您可以使用 Logstash 和指纹过滤器从您尝试去重的字段中生成唯一的指纹(哈希) ,并使用此指纹作为_id文档写入新集合时的指纹。由于该_id字段必须是唯一的,因此任何具有相同指纹的文档都将写入相同的文件_id并因此进行重复数据删除。
2)您可以编写一个滚动索引的自定义脚本。在读取每个文档时,您可以根据您认为定义唯一文档的content字段(在您的情况下为字段)创建哈希。然后使用这个哈希作为他们在字典(又名哈希表)中的键。与此键关联的值将是_id生成此相同散列的所有文档的列表。一旦您拥有所有散列和_ids 的关联列表,您就可以对除_id与每个相同散列关联的一个s 之外的所有 s 执行删除操作。请注意,第二种方法不需要将文档写入新索引以进行重复数据删除,因为您可以直接从原始索引中删除文档。
我在以下 URL 上写了一篇博客文章和代码来演示这两种方法:https : //alexmarquardt.com/2018/07/23/deduplicating-documents-in-elasticsearch/
免责声明:我是 Elastic 的一名咨询工程师。
我使用rails,如果有必要,我将使用命令导入内容FORCE=y,该命令会删除并重新索引该索引和类型的所有内容...但是不确定您在什么环境中运行ES。我能看到的唯一问题是数据源是否您导入的来源(即数据库)有重复的记录。我想我会首先看看数据源是否可以修复,如果可行,然后重新索引所有内容;否则,您可以尝试创建一种自定义导入方法,仅对每条记录的重复项之一进行索引。
此外,我知道这不符合您想要删除重复条目的要求,但您可以简单地自定义搜索,以便仅返回重复的 ID 之一,可以通过最近的“时间戳”或索引去重复的数据,然后按您的内容字段分组 - 看看这篇文章是否有帮助。尽管这仍然会在索引中保留重复记录,但至少它们不会出现在搜索结果中。
我也发现了这一点:Elasticsearch 删除重复项
我尝试为您考虑许多可能的情况,看看这些选项是否有效,或者至少可以作为临时修复。
| 归档时间: |
|
| 查看次数: |
10615 次 |
| 最近记录: |