2017-04-14 40 views
0

我在ElasticSearch中遇到了一个问题。ElasticSearch:已过滤的唯一记录上的聚合

我正在尝试从过滤的数据集中获取独特的文档并在其上进行聚合。

我们的数据集看起来像这样.. ID对象Property1 Property2 12 123测试1 Fest2 23 234 Test3的Fest4 5 123测试1 Fest2 55 123的Test2 Fest4 3 234的Test2 Fest2

我可能想要根据property2过滤设备,并在唯一过滤的记录的property1上聚合(分组依据)。 有人可以帮助我吗?

过滤并获取唯一记录。

{ 
"size": 0, 
"query": { "match": { "Property2": "Fest2" }}, 
"aggs": { 
    "Unique-Object": { 
     "terms": { 
     "field": "object.keyword", 
     "size": 20 
}, 
"aggs": { 
    "top_uids_hits": { 
      "top_hits": { 
      "sort": [ 
       { 
       "_score": { 
        "order": "desc" 
       } 
       } 
      ], 
      "size": 1 
      } 
     } 
     } 
    } 
    } 
}' 

我喜欢按Property1如下上述DSL的输出......莫非这方面的一些扔一个灯?

集团通过Property1

"aggs": { 
"Property1_count": { 
"terms": { 
"field": " Property1.keyword" 
} 

感谢 阿伦小号

+0

你可以为你的需求PLZ做SQL查询,所以你的问题将是明确的? 。 –

+0

谢谢。原始Sql查询是这样的...从表中选择count(DISTINCT id)Property2 ='xxx'group by property1 – Manoj

+0

更新了我的答案,我认为我们应该在id和property 1上使用两个group。检查你的测试数据。我已经在我的系统中测试过了。 –

回答

0

我认为这应该是您的查询。使用此检查,加入agg内: - 使用基数link

{ 
    "_source":false, 
    "query": { 
     "match": { 
      "Property2": "xxxx" 
     } 
    }, 
    "aggregations": { 
     "byProperty1": { 
      "terms": { 
       "field": "property1" 
      }, 
      "aggs": { 
       "byId": { 
        "cardinality": { 
         "field": "id" 
        } 
       } 
      } 
     } 
    } 
} 

对于java的实现,请检查我的answer。 检查此问题组在多个字段link