一尘不染

Elasticsearch-使用匹配查询和术语查询的“ OR”查询条件

elasticsearch

我有以下 匹配 查询字符串:

curl -XGET 'my-es.com/my_indice/_search?pretty' -d '{
  "size" : 10,
  "query" : {
    "bool" : {
      "must" : [ {
        "match" : {
          "state" : {
            "query" : ["ACTIVE", "INACTIVE"],
            "type" : "boolean"
          }
        }
      }]
    }
  }
}'

我想它的意思是"state" = "ACTIVE" or "state" = "INACTIVE",但实际上它能执行"state" = "INACTIVE"

然后我尝试了 术语 查询字符串:

curl -XGET 'my-es.com/my_indice/_search?pretty' -d '{
  "size" : 10,
  "query" : {
    "bool" : {
      "must" : [{
         "terms" : { "state" : ["ACTIVE", "INACTIVE"] }
      }]
    }
  }
}'

它执行"state" = "ACTIVE" or "state" = "INACTIVE",显示 术语 查询通过数组支持多个OR条件。

我很好奇为什么 匹配 查询不支持通过数组的 OR 条件?并且它不显示任何语法错误。


阅读 1347

收藏
2020-06-22

共1个答案

一尘不染

match查询仅支持要指定的单个字符串值。官方match文档中没有明确指定它,但是如果您愿意阅读的源代码MatchQueryParser.java,则可以看到,在解析query字段时,解析器将跳过标记来分隔数组的开始和结束,并始终覆盖value解析了最新的内容,因此您为什么要看到所看到的内容,即仅state与之匹配INACTIVE

但是,您可以做的是将两个标记放在同一个字符串中,如下所示,并且将考虑两个标记:

curl -XGET 'my-es.com/my_indice/_search?pretty' -d '{
  "size" : 10,
  "query" : {
    "bool" : {
      "must" : [ {
        "match" : {
          "state" : {
            "query" : "ACTIVE INACTIVE",
            "type" : "boolean"
          }
        }
      }]
    }
  }
}'
2020-06-22