如何组合multi_match和两个布尔过滤器

时间:2018-05-09 17:06:25

标签: elasticsearch

我可以成功地将multi_match查询与这样的过滤器结合起来:

{
    "query": {
        "bool": {
            "must":{
                "multi_match":{
                    "query": "ny gammal",
                    "fields": ["title", "description^1.4"],
                    "type": "cross_fields"
                }
            },
            "filter":{
                "range": {
                    "modelYear": {"gte": "2017"}
                }
            }
        }
    }
}

但是当我尝试添加另一个过滤器时(使用and因为我希望满足这两个条件),Elasticsearch告诉我我的查询不正确:

{
    "query": {
        "bool": {
            "must":{
                "multi_match":{
                    "query": "ny gammal",
                    "fields": ["title", "description^1.4"],
                    "type": "cross_fields"
                }
            },
            "filter":{
                "and":[
                    {
                        "range": {
                            "modelYear": {"gte": "2017"}
                        }
                    },
                    {
                        "term": {
                            "location": "Kumla"
                        }
                    }
                ]
            }
        }
    }
}

错误讯息:

{
    "error": {
        "root_cause": [
            {
                "type": "parsing_exception",
                "reason": "[and] query malformed, no start_object after query name",
                "line": 12,
                "col": 15
            }
        ],
        "type": "parsing_exception",
        "reason": "[and] query malformed, no start_object after query name",
        "line": 12,
        "col": 15
    },
    "status": 400
}

我怎样才能实现我想要的目标?我尝试了很多不同的事情,到目前为止还没有成功。

为了帮助您理解,我想要multi_match来获取得分文档,然后只保留通过两个过滤器的文件,即"location" == "Kumla"modelYear >= 2017。< / p>

我在文档中随处可见,令我惊讶的是,似乎没有任何关于如何实现这一点的讨论,即组合termrange过滤器。

我正在使用Elasticsearch 6。

1 个答案:

答案 0 :(得分:1)

你几乎就在那里,使用filter作为一个简单的数组,因为filter子句必须匹配所有。

{
  "query": {
    "bool": {
      "must": {
        "multi_match": {
          "query": "ny gammal",
          "fields": [
            "title",
            "description^1.4"
          ],
          "type": "cross_fields"
        }
      },
      "filter": [
        {
          "range": {
            "modelYear": {
              "gte": "2017"
            }
          }
        },
        {
          "term": {
            "location": "Kumla"
          }
        }
      ]
    }
  }
}

参考:Combine queries