2015-08-28 34 views
2

從字符串數組返回只有一個元素我有在一個場「strArray」字符串數組:在elasticsearch

strArray: ['browser:IE', 'device:PC', 'country:USA', 'state:CA'] 

我需要由瀏覽器(設備,國家或州)做聚合。如果我在strArray字段中知道這些值的順序,這不是問題。

我可以使用這些結構:

"aggs": { 
    "deviceAggs": { 
    "terms": { 
     "script": "doc['strArray'][1]" 
    } 
    } 
} 

但問題是,這些插入串的順序可以不同。

我該怎麼做?我想幾種方法:

  1. 腳本 - 使用像子字符串的功能,只獲得「正確的」值。

  2. 過濾 - 可以從數組中過濾一個值(其中包含字符串「device:」)。

  3. 對strArray值進行排序以將所有值按確定的順序排序,但「排序」給了我奇怪的結果 - 只返回一個元素(沒有任何篩選)。

不要問我,爲什麼我有這樣的結構(這不是我的選擇),如果我們有結構的關鍵:價值 - 我們不會有問題。

+0

我正在考慮對數組進行排序以獲取元素的可預測順序。 – Val

+0

@Val我已經檢查了它 - 「排序」 - 給我奇怪的結果。已更新的問題 – yAnTar

回答

2

腳本只能在這裏直接使用。 要了解如何在聚合中使用腳本,請參閱此blog

類似下面應該工作

for(element in doc['strArray'].values){ 
     if(element.startsWith('browser')){ 
      return element; 
     } 
}; 
return null; 

兩個排序和過濾是在文件級別完成,而不是等級。 在元素級別上,如果您可以使該數組嵌套,則可以進行過濾。首先,您需要將結構更改爲 -

strArray: [ 
    { "name" : 'browser:IE' } , 
    { "name" : 'device:PC' } 
] 

然後將strArray字段設置爲嵌套。 在這種情況下,您可以根據前綴查詢(使用查詢過濾器)執行嵌套過濾器,然後對數據執行嵌套聚合。

+0

非常感謝。你腳本的作品。你爲我節省了幾個小時的工作。 您也可以修復「返回」到「返回」並在返回null之前添加分號,因爲我在一行中使用此腳本並且沒有分號腳本失敗。 再一次感謝你。 – yAnTar