2016-09-21 43 views
1

对此问题也有类似的问题(请参阅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 } 

我基本上希望得到基于名称和事件的独特事件计数。我想避免重复计算事件B发生了哪些的同名X两次,所以我会找计数:

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

有作为所见设立AGG查询方式相关的问题?我仔细考虑过的另一个选项是用特殊的关键字段(即“X_A”,“X_B”等)索引对象。那么我可以简单地在这个领域进行重复数据删除我不确定哪个是首选的方法,但我个人更喜欢不用索引额外的元数据来索引数据。

回答

1

可以以建立一个键出多个字段的在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,所以除非我丢失了某些东西,否则计数不能为2。

+0

你对C计数是正确的,只是我的一个错字。修正它 – Shark

+0

很酷,很高兴它帮助! – Val