2016-09-26 637 views
1

我正在運行一個彈性搜索過濾器, (約1000萬點擊)的結果。我的from+size max是默認值(10,000次點擊)。我想基於一個字段進行聚合,並在所有桶中返回所有過濾器的匹配(而不僅僅是計數)。ES:Bucket agg + top_hits + scroll?如何在桶中返回所有命中(超過`size + from` max)?

我知道我可以使用top_hits來獲取每個存儲桶中的實際文檔(ElasticSearch: retriving documents belonging to buckets),但我認爲我需要滾動以獲取全部文檔(以獲得超過前10000個點擊次數)。我可以滾動和聚合嗎?當我使用聚合運行時,scroll api失敗。

目前,我有兩個解決方案似乎都沒有那麼大:

  1. 運行多個過濾器的查詢,表示各1桶(然後我不需要使用聚合+ top_hits命令)。 (對於我的應用程序太慢)

  2. 運行1個大的過濾器查詢,並且不聚集,但使用滾動api獲取所有匹配。然後,我將把它們放在我的主機上的相應桶中。 (不錯,但好像ES設置用於聚集到這些水桶給我,有更多的資源來完成這項工作)

是否有更好的方法來解決這個問題?

這似乎與此有關:(Paging elasticsearch aggregation results)雖然滾動API沒有提到(除非這就是他們所說的分頁?)

+0

每個存儲桶中是否有超過10,000個文檔?或者你有超過10,000個桶,並且想要翻閱這些桶? – jay

+0

某些桶的命中次數超過10,000次。現在我正在看〜500桶。我的總點擊量是1600萬, – travelingbones

回答

1

我相信不支持您的使用案例。聚合特別將文檔中的其他信息「拋出」。 Top hits僅用於在與您的查詢匹配的每個存儲分區中返回the most relevant匹配。這比文檔檢索功能更具備評分功能,即頂部命中agg並不意味着要返回存儲桶中的所有文檔。

如果您仍然需要所有文件,爲什麼不自己彙總結果?這是你的選擇#2,它似乎是我最好的選擇。

您引用的SO post描述了通過使用excludevalue filter in terms aggregations在聚合中分頁的解決方法。它不使用滾動API。我也不認爲它可以幫助你。

最後,Elasticsearch術語聚合通常有errors due to shard sizing。如果您仍然需要這些文檔,那麼您可以通過在應用程序中執行分包來獲得完全準確的聚合 - 您必須訪問每個文檔,這可能比ES能夠做得慢,但是您也得到了不同的結果。

如果您有關於您的用例的更多詳細信息,也許我們其中一個可以給出更好的建議。比如,爲什麼你需要所有的文件和桶數?

+0

我的目的是將文檔聚合成分類,然後從所有字段中構建特徵向量。所以,我需要整個文檔。我可以從ES桶計數中獲得一些功能,但大多數功能都更加複雜,並且在發生事件後需要自定義代碼。我確實使用ES對它們進行排序,這是一個好處。我會堅持選項2。 – travelingbones

相關問題