2016-02-12 19 views
0

一般問題是,我在彈性搜索中創建了名稱/值映射,以處理潛在的巨大用戶輸入標籤 - 而不是允許人們可以創建的開放模式具有新屬性的文檔。在ElasticSearch中彙總關鍵字/值列表

我有一個彈性的搜索映射,看起來像這樣:

  "Tags" : { 
       "properties" : { 
       "Value" : { 
        "analyzer" : "keyword", 
        "type" : "string" 
       }, 
       "Name" : { 
        "analyzer" : "keyword", 
        "type" : "string" 
       } 
       } 
      }, 

隨着看起來像這樣

  "Tags" : [ 
       { 
       "Name" : "group", 
       "Value" : "foobar" 
       }, 
       { 
       "Name" : "season", 
       "Value" : "winter" 
       } 
      ], 

記錄我試圖用一個彈性的搜索查詢做的是編寫一個只彙總季節條目的腳本。

... 
"script" : "for (int i = 0; i < doc['Tags.Value'].values.length; i++) { 
     if (doc['Tags.Value'].values[i] == 'season') { 
       return doc['Tags.Names'].values[i] 
      } }" 
... 

我已經經歷了上述腳本的大約200個排列,它並沒有完全返回我想看到的結果。

+0

您期待什麼輸出? – Richa

回答

0

Tags場應該是nested,使你可以寫一個nested查詢,只選擇season標籤,然後你只能在這些值聚集。如果你有大量的標籤,這將允許你放棄那個腳本,這個腳本的表現會非常糟糕。

所以,你的映射需要看起來像這樣:

 "Tags" : { 
      "type": "nested",     <---- add this 
      "properties" : { 
      "Value" : { 
       "analyzer" : "keyword", 
       "type" : "string" 
      }, 
      "Name" : { 
       "analyzer" : "keyword", 
       "type" : "string" 
      } 
      } 
     }, 

然後將查詢應包括關於season標籤名稱的nested條款,使你的terms聚合可以簡單地對那些值工作。

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "nested": { 
      "path": "Tags", 
      "filter": { 
      "term": { 
       "Tags.Name": "season" 
      } 
      } 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "season_tags": { 
     "nested": { 
     "path": "Tags" 
     }, 
     "aggs": { 
     "season_values": { 
      "terms": { 
      "field": "Tags.Value" 
      } 
     } 
     } 
    } 
    } 
} 
+0

它曾經是一個嵌套的文檔。你將如何聚合兩個標籤字段?那麼季節呢? – koblas

+0

爲什麼「習慣」是?你爲什麼改變? – Val

+0

我一直在努力讓嵌套聚合工作,所以這就是我改變的原因。我已經改變了它,並將嘗試這一點。 雖然在考慮這個問題時,如果你想要在你的例子中無法過濾的「組」和「季節」聚合,這兩個字段將如何聚合。也許你可以,我只需要嘗試... – koblas