首页 文章

混合过滤器,在ElasticSearch中使用OR和AND

提问于
浏览
0

在您看来,最好的方法是做什么?

我想通过在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过滤器吗?

1 回答

  • 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"
                        }
                    }
                }
            ]
        }
    }
    

相关问题