我有以下 匹配 查询字符串:
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 条件?它没有显示任何语法错误。
答案 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"
}
}
}]
}
}
}'