排序我有2種型號:Products
和Skus
,其中Product
有一個或多個Skus
和Sku
屬於一個Product
。它們有以下欄目:Elasticsearch搜索和跨2款
Product: id, title, content, category_id
Sku: id, product_id, price
我希望能夠在不同的搜索每頁顯示48個產品和排序配置,但我有麻煩翻譯這elasticsearch。
例如,我不清楚如何在搜索title
時搜索相關結果,並將最低價格Sku
分類爲Product
。我已經嘗試了一些不同的東西,最近一直以指數作爲一切屬於該Sku
,然後搜索像這樣:
size: '48',
aggs: {
group_by_product: {
terms: { field: 'product_id' }
}
},
filter: {
and: [{
bool: {
must: { range: { price: { gte: 0, lte: 50 } } }
},{
bool: {
must: { terms: { category_id: [ 1, 2, 3, 4, 5, 6 ] } }
}
}]
},
query: {
fuzzy_like_this: {
fields: [ 'title', 'content' ],
like_text: 'Chair',
fuzziness: 1
}
}
但是這給48匹配Skus
,其中許多屬於同一Product
,所以如果我在搜索後嘗試將它們合併,我的分頁就會關閉。
什麼是處理此用例的最佳方法?
更新
與嵌套的方法嘗試使用以下結構:
{
size: '48',
query:
{ bool:
{ should:
{ fuzzy_like_this:
{ fields: [ 'title' ],
like_text: 'chair',
fuzziness: 1 },
},
{ must:
{ nested:
{ path: 'skus',
query:
{ bool:
{ must: { range: { price: { gte: 0, lte: 100 } } }
}
}
}
}
}
}
},
sort:
{ _score: 'asc',
'skus.price':
{ nested_path: 'skus',
nested_filter:
{ range: { 'skus.price': { gte: 0, lte: 100 } } },
order: 'asc',
mode: 'min'
}
}
}
這可能是更接近,但仍不能確定如何對其進行格式化。以上提供了按價格排序的產品,但似乎完全忽視了搜索領域。
包括SKU內的產品的方法是正確的。我相信它可以改進的地方是聚合部分。你實際需要的是桶的數量是48,而不是文檔的數量。因爲桶代表產品。關於分頁,彙總[這不是atm可能的](https://github.com/elastic/elasticsearch/issues/4915)。 –
你嘗試過嵌套的對象,其中Skus是嵌套的對象嗎? –
@AndreiStefan是的,我已經試過在產品下嵌套skus,但無法找出正確的價格排序方式。如果桶分頁是不可能的,那麼似乎會排除聚合方法? – tyler