2017-04-14 43 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