我有2个模型:grep
和Products
,其中Skus
有一个或多个Product
,而Skus
只属于Sku
Product
1}}。它们包含以下列:
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
}
}
,然后搜索如下:
Skus
但这会产生48个匹配的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'
}
}
}
,所以如果我在搜索后尝试将它们组合起来,我的分页就会关闭。
处理此用例的最佳方法是什么?
更新
尝试使用嵌套方法,使用以下结构:
int id = 0, age, exp;
double avgAge = 0, avgExp;
char type;
string eligibility = "";
这可能更接近,但仍不确定如何格式化它。以上是按价格订购的产品,但似乎完全忽略了搜索字段。
答案 0 :(得分:1)
自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"
}
}
]
}