我有一组文档(类型'文章'),我想搜索具有元素/对象的文档到数组字段中
{ "_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 } } } } ] } } }
这不起作用.
你会如何解决我的疑问?
但主要是:
如何搜索具有空数组字段的文档?
Zoltan Balog.. 8
如果address
是location
数组中的必填字段,则可以修改查询:
"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"
如果address
是location
数组中的必填字段,则可以修改查询:
"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"