query_string中的AND / OR优先级不正确

时间:2016-02-29 10:47:05

标签: elasticsearch

今天我发现了elasticsearch 1.5.2

的奇怪行为

我正在索引2份文件:

POST http://localhost:9200/index/type {
    "string":"a b"
}

POST http://localhost:9200/index/type {
    "string" : "c d"
}

以下查询返回没有命中(为什么?):

POST http://localhost:9200/index/type/_search
{
    "query" : {
        "query_string" : {
            "query_string" : {
                "query" : "string:a AND string:b OR string:c AND string:d"
            }
        }
    }
}

但是在ANDs上使用括号的相同查询会返回2个文档,如预期的那样:

POST http://localhost:9200/index/type/_search
{
    "query" : {
        "query_string" : {
            "query_string" : {
                "query" : "(string:a AND string:b) OR (string:c AND string:d)"
            }
        }
    }
}

根据规范 (https://www.elastic.co/guide/en/elasticsearch/reference/1.5/query-dsl-query-string-query.html

  

NOT优先于AND,优先于OR

因此两个查询必须返回相同的结果。

是错误还是我错过了什么?

提前致谢!

1 个答案:

答案 0 :(得分:0)

您提到的查询

"query" : "string:a AND string:b OR string:c AND string:d"

作为所有a,b和d应该出现在string中,如果存在c,则该文档将被提升。

这就是为什么它会查找在任何文档中找不到的a,b和d并且不显示结果。

根据规范here

  

AND和OR可以影响左右两个词。

您也可以参考this