2017-10-16 67 views
0

我是elasticsearch的新手,我有一些技術難點。目前我有按小時索引存儲的文檔,它們是時間序列數據。我試圖弄清楚的是如何有效地提取只有key字段值,它被定義爲"key": { "type": "long" }。我最初嘗試的是天真的方法,它滾動瀏覽所有索引並提取字段,但顯然這不會很快完成,每個小時索引大約有10M個文檔,並且滾動3個索引已經耗盡了。如何高效地獲取彈性搜索的一個文檔域

然後我來到terms aggregations,試圖讓key字段作爲聚集項:

"aggregations": { 
    "test_group": { 
     "terms": { 
     "field": "key", 
     "size": 100000 
     } 
    } 
    } 

這給了我更好的性能,但仍不足以作爲一個實時系統爲用戶嘗試搜索歷史,因爲key是一個高基數字段。一些粗略的基準對我說:

size = 50k, indices = 4, time range = 3hrs: 7.1s 
size = 100k, indices = 4, time range = 3hrs: 7.669s 
size = 1m, indices = 4, time range = 2hrs: 12.669s 
size = 1m, indices = 4, time range = 3hrs: 14.669s 

這不是它的結束,因爲我使用elastic search go library解析輸出,並做一些處理,這增加了不平凡的時間,總體響應。

我的問題是:這已經是ES最好的了嗎?有沒有其他的方法,我錯過了?我目前在集羣的ES 5.6和3個節點上,全部使用Amazon i3-4xl實例。謝謝。

回答

0

如果我正確理解您的問題,您正在嘗試從您的文檔中檢索一個名爲'key'的特定字段,並且我假設您的文檔中還有其他字段正在返回,而您並不在意?

如果是的話,試試這個:

GET /_search 
{ 
    "_source": { 
     "includes": ["key"] 
    } 
} 
+0

我不認爲這會工作。我首先使用'scroll'的原因是因爲不推薦使用'query'來查詢大型數據集。即使可以通過yaml文件更改限制,但在使用普通查詢作爲我最後的解決方案之前,我寧願尋求其他選項。 –