2016-08-10 99 views
0

在我們的網站,我們允許用戶過濾與類別分爲一組過濾彈性的搜索結果:如何獲得彈性搜索聚合以鏡像查詢過濾邏輯?

A 
    A1 
    A2 
    ... 
B 
    B1 
    B2 
    B3 
    ... 

這些只是對可以出現在文檔的領域,比如文字標籤匹配:

{ tags: ["A1", "B1", "B2"] } 

我們現有的查詢連接的所有過濾條件下和,因此,如果用戶選擇A1B1B2,我們通過(A1 AND B1 AND B2)篩選。

我們希望將其更改爲「每個過濾器類別中的OR」和「AND跨類別」,以便您能得到:(A1) AND (B1 OR B2)

現在,皺紋:我們還在「標籤」字段上使用「術語」聚合來預測應用下一個過濾器將返回多少物品。在我們的UI,這看起來像:

A 
    A1 12 # If the user adds the A1 filter, there'll be 12 results. 
    A2 3 # etc. 
    ... 
B 
    B1 5 
    B2 0 
    B3 2 
    ... 

這裏,改變濾波器的邏輯和/或打破了來自「條款」聚集回數,因爲該條款的聚集仍然預測A1 AND B1 AND B2。添加B3將得到我們A1 AND B1 AND B2 AND B3,從而縮小聚合的數量,但它實際上會擴大結果的範圍(我們希望(A1) AND (B1 OR B2 OR B3))。

有沒有辦法在聚合中表達這種情況,以便過濾邏輯和聚合計數匹配?

回答

2

您可以使用Filter aggregation構建存儲桶,該存儲池基於任何可以在常規查詢中用作過濾器的任何內容。如果您能夠事先構建過濾器並且沒有太多可能的值,這可以工作,因爲您需要爲每個「下一個」組合定義一個過濾器存儲桶。請注意,與簡單的Terms aggregation相比,這可能會對性能產生影響。

有關詳細信息,請參閱該文檔在:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filter-aggregation.html

+0

有趣的 - 所以我需要發送類似的信息(當前過濾器+ A1),(當前過濾器+ A2),等等,每一個可能的下一個過濾器?我們有幾百個過濾器,可以運行五六千個文件 - 這種方法是否仍然可行? – user1454265

+0

正如我所說的,我不確定當你有很多不同的標籤(術語)需要構建「下一個」過濾器時它是否是一個很好的解決方案。 Elasticsearch在緩存和重用(部分)過濾器方面做得很好,所以我認爲你可以嘗試。五六千也沒有那麼多文件。它更多的是構建聚合,然後手動提取結果。可能有辦法一次不顯示所有結果? –

+0

謝謝,今天就有了這種方法(ES 1.7)。儘管如此,我在某處遇到了限制(可能在我們的堆棧中),這限制了我的過濾器聚合到200個桶。 – user1454265