Elasticsearch - " OR"使用匹配查询和术语查询查询条件

时间:2015-12-28 21:54:51

标签: 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"

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

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

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

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

1 个答案:

答案 0 :(得分:2)

match查询仅支持指定单个字符串值。它未在official match documentation中明确指定,但如果您愿意阅读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"
          }
        }
      }]
    }
  }
}'