我想使用bool查询,其中一个条件(例如,在should部分中)是对某事的否定。
具体做法是:
1)字段不存在。例如,我尝试了查询:
{"query":{
"bool":{
"must":[
{"match":{"field1":"val1"}},
],
"should":[
{"match":{"field2":"val2"}},
{"filtered" :
{
"query" : {"match_all" : {}},
"filter" : {"missing" : { "field":"field3"}}
}
},
],
"minimum_number_should_match":1
}
}
}
2)字段没有值。例如:
{"query":{
"bool":{
"must":[
{"match":{"field1":"val1"}},
],
"should":[
{"match":{"field2":"val2"}},
{"filtered" :
{
"query" : {"match_all" : {}},
"filter" : {"not" : { "field3":"val3"}}
}
},
],
"minimum_number_should_match":1
}
}
}
两者都不起作用。我必须应用过滤器或插入内部查询错误。 我怎样才能做到这一点?
答案 0 :(得分:2)
并不完全确定这是完全回答原始问题,但它是相似的,并通过单独运行两个查询排队的计数进行验证。这会找到一些null或true的字段:
{
"filtered" : {
"filter" : {
"or" : [
{ "missing" : { "field" : "somefield" } },
{ "term" : { "somefield" : "true" } }
]
}
}
}
祝你好运。 JSON查询语言让我想念SQL!
答案 1 :(得分:1)
我只是在bool查询之外成功使用了缺少和非过滤器。
例如:
"filtered_query":{
"query":{
"bool":{ ... }
},
{"filter": {
"missing":{ ... }
}
}
你不会在这种情况下得到任何得分(只是结果'过滤掉'或不是),尽管你没有明确说你需要得分。
您可能希望查看缺少过滤器的文档,了解您所声明的要求,因为它允许您检查不存在的字段,或者没有值。我认为不功能在您的第二个示例中没有达到预期效果。供参考:http://www.elasticsearch.org/guide/reference/query-dsl/missing-filter/
"missing" : {
"field" : "user",
"existence" : true,
"null_value" : true
}
确保适当地使用exists和null_value属性来指示是否要匹配缺少的字段(“exists”:true)或要匹配的空/ null值(“null_value”:true)