gpt4 book ai didi

elasticsearch - Elasticsearch在2个模型中进行搜索和排序

转载 作者:行者123 更新时间:2023-12-02 23:30:33 25 4
gpt4 key购买 nike

我有2个模型:ProductsSkus,其中Product具有一个或多个Skus,而Sku恰好属于一个Product。它们包含以下列:

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'
}
}
}

这可能更接近,但仍不确定如何格式化。上面给出了按价格订购的产品,但似乎完全忽略了搜索字段。

最佳答案

由于paginating aggregation results is not possible,即使将sku包含在product中的方法是一种很好的方法,但我还是会根据查询的要求使用nested对象。

作为示例查询:

GET /product/test/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"title": {
"query": "whatever",
"fuzziness": 1,
"prefix_length": 3
}
}
},
{
"nested": {
"path": "skus",
"query": {
"range": {
"skus.price": {
"gte": 11,
"lte": 50
}
}
}
}
}
]
}
},
"sort": [
{
"skus.price": {
"nested_path": "skus",
"order": "asc",
"mode": "min"
}
}
]
}

关于elasticsearch - Elasticsearch在2个模型中进行搜索和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36899749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com