使用多个字段作为唯一键的重复数据删除 elasticsearch 结果

Sha*_*ark 6 duplicates elasticsearch

有人对此提出了类似的问题(请参阅从 Elasticsearch 中的搜索中删除重复的文档),但我还没有找到使用多个字段作为“唯一键”进行重复数据删除的方法。这是一个简单的例子来说明我正在寻找的一些东西:

假设这是我们的原始数据:

{ "name": "X", "event": "A", "time": 1 }
{ "name": "X", "event": "B", "time": 2 }
{ "name": "X", "event": "B", "time": 3 }
{ "name": "Y", "event": "A", "time": 4 }
{ "name": "Y", "event": "C", "time": 5 }
Run Code Online (Sandbox Code Playgroud)

我基本上想根据名称和事件获得不同的事件计数。我想避免重复计算在同名 X 上发生的事件 B 两次,所以我要寻找的计数是:

event: A, count: 2
event: B, count: 1
event: C, count: 1
Run Code Online (Sandbox Code Playgroud)

有没有办法设置 agg 查询,如相关问题所示?我考虑过的另一个选项是使用特殊键字段(即“X_A”、“X_B”等)为对象建立索引。然后我可以简单地对这个字段进行重复数据删除。我不确定哪种方法是首选方法,但我个人不希望用额外的元数据索引数据。

Val*_*Val 6

您可以在terms聚合中指定一个脚本,以便从多个字段中构建一个键:

POST /test/dedup/_search
{
  "aggs":{
    "dedup" : {
      "terms":{
        "script": "[doc.name.value, doc.event.value].join('_')"
       },
       "aggs":{
         "dedup_docs":{
           "top_hits":{
             "size":1
           }
         }
       }    
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这将基本上提供以下结果:

  • X_A: 1
  • X_B:2
  • Y_A: 1
  • Y_C: 1

注意:C您的示例数据中只有一个事件,因此除非我遗漏了什么,否则计数不能为两个。