查找空对象的Elasticsearch值

时间:2018-02-15 18:35:40

标签: elasticsearch

我想运行一个查询来查看有多少文档将空对象存储为其值。例如,它将返回如下文档:

override func viewWillAppear() {
    let mc = MenuController()
    mc.enableEditingMenu( enabled: true )
}

override func viewWillDisappear() {
    let mc = MenuController()
    mc.enableEditingMenu( enabled: false )
}

但是没有字段/具有未定义值的字段,或者包含属性的字段的字段:

"hits": [
  {
    "_source": {
      "otherfield": "abc",
      "somefield": {}
    }
  }
]

但是我的查询也将返回文档,其中字段是具有"hits": [ { "_source": { "otherfield": "abc", // <-- note no "somefield" } }, { "_source": { "otherfield": "abc", "somefield": { "field1": "value1" } } } ]

等属性的对象
"somefield": { "field1": "value1" }

使用Elasticsearch 5.4

1 个答案:

答案 0 :(得分:0)

以下查询应足以查找包含空somefield字段的所有文档:

{
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "somefield"
        }
      }
    }
  }
}

虽然您的查询对我来说有点混乱。首先,您要查找不存在somefield.field1的任何文档。然后,将must_not子句的内容与使用非空should过滤文档的somefield子句的互斥内容组合在一起。实际上should子句被翻译成

"should": [{
    "exists": {"field": "somefield.field1"}
}]

因此,您的查询既不应与somefield: {}的文档匹配,也不应与somefield: {field1: value1}的文档匹配。