[英]Sorting and filtering elastic search top hits docs
可以說我對這樣的文檔有一個簡單的產品索引:
{
"product_name": "some_product",
"category": "some_cotegory",
"price": "200"
"sold_times": "5",
"store": "store1"
}
而且我想獲得他們類別和每家商店中銷售次數少於3次的最貴產品,我希望它們按商店,類別和價格訂購。
我可以使用兩個術語匯總和熱門匹配匯總來獲得每個商店其類別中最昂貴的產品,但是如何對這些熱門匹配結果進行排序和過濾? 我真的需要在執行top hits agg之后過濾結果,因此過濾查詢不是解決方案。 我怎樣才能做到這一點? 謝謝
編輯:
長話短說 - 我需要SQL的彈性等價物:
SELECT p.*
FROM products AS p
INNER JOIN (
SELECT max(price) AS price, categroy, store
FROM products
GROUP BY category, store
) AS max_prices ON p.price = max_prices.price AND p.category = max_prices.category AND p.store = max_prices.store
WHERE p.sold_times < 3;
您可以過濾搜索以僅返回銷售少於3次的產品,然后按商店和類別聚合,然后最終應用熱門點擊聚合以獲取該類別中最昂貴的項目(針對該商店)。 就像是
{
"size": 0,
"query": {
"range": {
"sold_times": {
"lt": 3
}
}
},
"aggs": {
"store": {
"terms": {
"field": "store",
"size": 10
},
"aggs": {
"category": {
"terms": {
"field": "category",
"size": 10
},
"aggs": {
"most_expensive": {
"top_hits": {
"size": 1,
"sort": [
{
"price": {
"order": "desc"
}
}
]
}
}
}
}
}
}
}
}
好了,經過一番搜索,我找到了“可能的”解決方案。 我可以將Bucket Selector聚合與一些腳本結合使用,該腳本將使可訪問的熱門匹配屬性進行過濾,以及使用Bucket Sort聚合進行排序的類似方法(可以在此處找到一些信息: 如何過濾top_hits指標聚合結果[Elasticsearch] )
但我面臨着聚合的另一個問題。 因為我想使用很多類別(例如在通用搜索查詢中使用的“滾動”或“大小和來源”),但是使用聚合無法輕松完成。 有一個Composite Aggregation可以做類似的事情,但畢竟查詢是如此復雜,以至於讓我非常害怕,所以我決定放棄它,並在彈性之外進行分組。
令人遺憾的是,沒有一種簡單的方法可以在Elastic中進行這種常見的分析查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.