在您看来,最好的方法是做什么?
我想通过在OR过滤器中分组的几个范围过滤ElasticSearch查询,然后按需要包含在AND过滤器中的一个最终范围过滤。解释有点蹩脚,但希望下面的伪代码有帮助......
基本上我尝试构建以下查询:
{
"query":{
"multi_match":{
"query":"blue",
"fields":[
"name"
]
}
},
"sort":{
"_score":{
"order":"desc",
"missing":"_last"
}
},
"from":"0",
"size":"24",
"facets":{
"rating":{
"range":{
"field":"rating",
"ranges":[
{
"from":1
},
{
"from":2
},
{
"from":3
},
{
"from":4
}
]
}
},
"price":{
"range":{
"field":"price",
"ranges":[
{
"to":10
},
{
"from":10,
"to":100
},
{
"from":100,
"to":1000
}
{
"from":1000
}
]
}
}
},
"filter":{
"or":[
{
"range":{
"price":{
"from":"10",
"to":"100"
}
}
},
{
"range":{
"price":{
"from":"100",
"to":"1000"
}
}
}
],
"and":{
"numeric_range":{
"rating":{
"gte":"4"
}
}
}
}
}
失败时出现“没有解析元素[numeric_range]”的错误。所以我尝试更换:
"and":{
"numeric_range":{
"rating":{
"gte":"4"
}
}
}
使用:
"numeric_range":{
"rating":{
"gte":"4"
}
}
查询现在返回结果,但它返回结果,价格范围为10-100,100-1000,任意结果的评级大于4(即使它们的价格超出了定义的范围)。
有关如何进行此查询的任何线索?我需要使用bool过滤器吗?
答案 0 :(得分:1)
啊哈,在Boaz Leskes的帮助下,在ElasticSearch邮件列表上找到了它!
它的结构应该是这样的:
filter: {
bool: {
must: [
{
"numeric_range":{
"rating":{
"gte":"4"
}
}
}
],
should: [
{
"range":{
"price":{
"from":"10",
"to":"100"
}
}
},
{
"range":{
"price":{
"from":"100",
"to":"1000"
}
}
}
]
}
}