在我們的網站,我們允許用戶過濾與類別分爲一組過濾彈性的搜索結果:如何獲得彈性搜索聚合以鏡像查詢過濾邏輯?
A
A1
A2
...
B
B1
B2
B3
...
這些只是對可以出現在文檔的領域,比如文字標籤匹配:
{ tags: ["A1", "B1", "B2"] }
我們現有的查詢連接的所有過濾條件下和,因此,如果用戶選擇A1
,B1
和B2
,我們通過(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)
)。
有沒有辦法在聚合中表達這種情況,以便過濾邏輯和聚合計數匹配?
有趣的 - 所以我需要發送類似的信息(當前過濾器+ A1),(當前過濾器+ A2),等等,每一個可能的下一個過濾器?我們有幾百個過濾器,可以運行五六千個文件 - 這種方法是否仍然可行? – user1454265
正如我所說的,我不確定當你有很多不同的標籤(術語)需要構建「下一個」過濾器時它是否是一個很好的解決方案。 Elasticsearch在緩存和重用(部分)過濾器方面做得很好,所以我認爲你可以嘗試。五六千也沒有那麼多文件。它更多的是構建聚合,然後手動提取結果。可能有辦法一次不顯示所有結果? –
謝謝,今天就有了這種方法(ES 1.7)。儘管如此,我在某處遇到了限制(可能在我們的堆棧中),這限制了我的過濾器聚合到200個桶。 – user1454265