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

时间:2013-12-04 11:20:26

标签: elasticsearch

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

我想通过在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 个答案:

答案 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"
                    }
                }
            }
        ]
    }
}