2017-03-16 105 views
0

我有如下的情景: 假設我有一個關係表:彈性搜索查詢像SQL

Key1 Key2 Key3 Value 

A  x  v1  0 
A  x  v1  10 
B  x  v1  5 
A  y  v2  7 
A  y  v2  2 

這裏我有(密鑰1,密鑰2,密鑰3)的邏輯關鍵複合材料。現在我需要具有最大價值的記錄。所以我期望下面的結果對應不同的邏輯鍵:

Key1 Key2 Key3 Value 

A  x  v1  10 
B  x  v1  5 
A  y  v2  7 

現在我想爲它編寫一個彈性搜索查詢。有人可以給我一些想法嗎?

+2

多級'terms'聚集會做的伎倆。更高效的方法是在索引時將該複合鍵添加爲文檔中的新字段,以便單個「詞條」聚合可以獲得所需的結果。 – Val

+0

實際上,我不想添加任何新字段,並且希望獲得完整的記錄,正如您在上面的預期結果中看到的那樣。 – pbajpai21

回答

0

然後你可以用多層次terms聚集這樣走:

{ 
    "size": 0, 
    "aggs": { 
    "key1": { 
     "terms": { 
     "field": "key1" 
     }, 
     "aggs": { 
     "key2": { 
      "terms": { 
      "field": "key2" 
      }, 
      "aggs": { 
      "key3": { 
       "terms": { 
       "field": "key3" 
       }, 
       "aggs": { 
       "doc": { 
        "top_hits": { 
        "sort": {"value": "desc"} 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

感謝您的回覆,實際上我需要獲取完整的文檔,但是對於aggr,我們可以獲得文檔計數或數學函數值,如max,min或avg。 – pbajpai21

+0

我已經更新了我的答案,以獲得具有給定密鑰的最高值的文檔。 – Val

+0

謝謝,查詢正在工作,但由於我只對一個文檔有最大值感興趣,所以我們可以避免排序並通過某種方式獲得最大值?這將是對查詢的優化。 – pbajpai21