6

我有一组文档(类型为'article'),我想在数组字段中搜索包含元素/对象的文档

{
    "_type": "article",
    "_source": {
        "title": "Article 1",
        "locations": [
            {
                "address": "ES headquarter",
                "city": "Berlin"
            }
        ]
    }
}

我想要两个查询(只有一个,但有一点变化):

  • 获取所有有位置的文章
  • 获取所有没有位置的文章

我尝试了不同的方法,但可能我对 ElasticSearch 太差了:

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": [
        {
          "type": {
            "value": "article"
          }
        },
        {
          "bool": {
            "must_not": {
              "missing": {
                "field": "location",
                "existence": true,
                "null_value": true
              }
            }
          }
        }
      ]
    }
  }
}

这不起作用。

  • 您将如何解决我的查询?

但主要是:

  • 您将如何搜索具有空数组字段的文档?
4

3 回答 3

11

如果addresslocation数组中的必填字段,您可以修改查询:

"must_not": {
  "missing": {
    "field": "locations.address"
  }
}

AFAIK,在 ES 中,您不能查询非叶元素(例如您的location字段)(请参阅问题),并且如果object类型 ES 会展平嵌套字段(请参阅嵌套类型对象类型)。这就是为什么我建议改为查询叶子元素之一。但它要求其中之一是强制性的(不幸的是,您的情况并不满足)。

无论如何,我使用source_filtering_source中的参数找到了解决方案:

"must_not": {
  "script": {
    "script": "_source.locations.size() > 0"
  }
}

请注意,使用"lang":"groovy"您应该编写:"script": "_source.locations.size > 0"

于 2014-11-04T15:50:59.247 回答
6

如果您不想启用脚本,可以将Exists Querymust_not bool 查询结合使用,例如:

{
  "query":{
    "bool":{
      "must_not":[
        {
          "exists":{
            "field":"tags"
          }
        }
      ]
    }
  }
}
于 2018-09-18T16:29:11.050 回答
-1

似乎已经回答了类似的问题,我没有测试解决方案,但您可以尝试一下:>> elasticsearch filter by the size of a field that is an array

于 2014-11-04T16:37:29.350 回答