Bool查询其中一个“should”是Elasticsearch中的“not”

时间:2013-04-22 09:11:27

标签: elasticsearch

我想使用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
                    }
         }
}

两者都不起作用。我必须应用过滤器或插入内部查询错误。 我怎样才能做到这一点?

2 个答案:

答案 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)