I have a set of documents (type 'article') and I want to search for the document that have elements/objects into an array field
{
"_type": "article",
"_source": {
"title": "Article 1",
"locations": [
{
"address": "ES headquarter",
"city": "Berlin"
}
]
}
}
I want two queries (just one, but with a little variation):
I tried different things but probably I'm too bad with ElasticSearch:
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": [
{
"type": {
"value": "article"
}
},
{
"bool": {
"must_not": {
"missing": {
"field": "location",
"existence": true,
"null_value": true
}
}
}
}
]
}
}
}
this doesn't work.
but mainly:
If address
is a mandatory field in location
array you can modify your query:
"must_not": {
"missing": {
"field": "locations.address"
}
}
AFAIK, in ES you cannot query non-leaf elements (like your location
field) (see issue), and in case object
types ES flattens the nested fields (see nested type, object type). That's why I suggested to query for one of the leaf elements instead. But it requires that one of them is mandatory (which is unfortunately not satisfied in your case).
Anyway I found the solution using the _source
parameter inside the source_filtering:
"must_not": {
"script": {
"script": "_source.locations.size() > 0"
}
}
Note that using "lang":"groovy"
you should write: "script": "_source.locations.size > 0"