Dedup elasticsearch结果使用多个字段作为唯一键

时间:2016-09-21 00:44:49

标签: elasticsearch duplicates

对此问题提出了类似的问题(请参阅Remove duplicate documents from a search in 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 }

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

event: A, count: 2
event: B, count: 1
event: C, count: 1

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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