2

我想使用一个布尔查询,其中一个条件(例如,在应该部分中)是对某事的否定。

具体来说:

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
                    }
         }
}

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

4

2 回答 2

2

不完全确定这是否完全回答了原始问题,但它是相似的,并通过分别运行两个查询的计数来验证。这会找到一些为 null 或 true 的字段:

{
    "filtered" : {
        "filter" : {
            "or" : [
                { "missing" : { "field" : "somefield" } },
                { "term" : {  "somefield" : "true" } }
            ]
        }
    }
}

祝你好运。JSON 查询语言让我想念 SQL!

于 2013-12-02T19:32:41.827 回答
1

我只成功地使用了 bool 查询之外的缺失过滤器而不是过滤器。

例如:

"filtered_query":{
  "query":{
    "bool":{ ... }
  },
  {"filter": {
    "missing":{ ... }
  }
} 

您不会在该条件下获得任何评分(只是结果“过滤掉”或没有),尽管您没有明确表示您需要评分。

您可能需要查看文档以了解您声明的两个要求的缺失过滤器,因为它允许您检查不存在或没有值的字段。我不认为not函数正在执行您在第二个示例中的期望。供参考:http ://www.elasticsearch.org/guide/reference/query-dsl/missing-filter/

"missing" : { 
     "field" : "user",
     "existence" : true,
     "null_value" : true
}

确保适当地使用存在和 null_value 属性来指示是要匹配缺失字段(“existence”:true)还是要匹配空/空值(“null_value”:true)

于 2013-04-26T14:24:35.780 回答