在must_not对象

时间:2018-05-09 17:57:07

标签: elasticsearch

此查询正常工作:

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

它会返回modelYear小于2014的所有对象。假设我想在2010年到2013年之间获得modelYear的所有对象。我会这样做:

{
    "query": {
        "bool": {
            "must":{
                "multi_match":{
                    "query": "ny gammal",
                    "fields": ["title", "description^1.4"],
                    "type": "cross_fields"
                }
            },
            "must_not":{
                "range": {
                    "modelYear":{"gte": 2014, "lt":2010}
                }
            }
        }
    }
}

令我惊讶的是,查询返回与此查询相同的结果:

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

与没有must_not子句的查询结果相同。

据我所知,我没有做错任何事。这是一个错误吗?如何使第二个查询起作用?

我正在使用Elasticsearch 6。

2 个答案:

答案 0 :(得分:0)

更直观(可读)的方法是

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

现在,就您的解决方案而言,这取决于您的数据。 提供一个最小的测试样本,展示您的查询不起作用。 提供一些样本数据并进行映射(省略不相关的字段)。

答案 1 :(得分:0)

我可以确认原始观察结果。样本测试数据为

curl -X PUT http://localhost:9200/rqs-mustnot/Car/1234 -d '{"modelYear":2002, "title":"ny gammal 1", "description":"ny gammal 2002"}'
curl -X PUT http://localhost:9200/rqs-mustnot/Car/2345 -d '{"modelYear":2012, "title":"ny gammal 2", "description":"ny gammal 2012"}'
curl -X PUT http://localhost:9200/rqs-mustnot/Car/3456 -d '{"modelYear":2018, "title":"ny gammal 3", "description":"ny gammal 2018"}'

我认为问题在于"modelYear":{"gte": 2014, "lt":2010} range子句:

这始终是错误的。日期不能同时大于2014年和小于2010年。

must_not的错误值始终为true。并且must数组中始终为true的子句与省略它相同。