rethabile
rethabile

Reputation: 3199

elastic exists query for nested documents

I have a nested documents as:

"someField": "hello",
"users": [
   {
     "name": "John",
      "surname": "Doe",
      "age": 2
   }
]

according to this https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-exists-query.html, the above should match:

GET /_search
{
  "query": {
    "exists" : { "field" : "users" }
  }

}

whereas the following should not,

"someField": "hello",
"users": []

but unfortunately both do not match. any ideas?

Upvotes: 49

Views: 44975

Answers (6)

sjsj15
sjsj15

Reputation: 805

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "users",
            "query": {
              "exists": {
                "field": "users"
              }
            }
          }
        }
      ]
    }
  }
}

Upvotes: 0

Robert
Robert

Reputation: 694

Shorter version (without bool query), (tested on ElasticSearch 7.x)

{
  "query": {
    "nested": {
      "path": "users",
      "query": {
        "exists": {
          "field": "users"
        }
      }
    }
  }
}

Upvotes: 0

golkedj
golkedj

Reputation: 111

The answer from user3775217 has worked for me but I needed to tweak it to work as expected for must_not. Essentially the bool/must needed to be wrapped around the nested portion of the query:

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "users",
            "query": {
              "exists": {
                "field": "users"
              }
            }
          }
        }
      ]
    }
  }
}

Upvotes: 2

user3775217
user3775217

Reputation: 4803

The example mentioned on the Elasticsearch blog refers to string and array of string types, not for nested types.

The following query should work for you:

{
    "query": {
        "nested": {
            "path": "users",
            "query": {
                "bool": {
                    "must": [
                        {
                            "exists": {
                                "field": "users"
                            }
                        }
                    ]
                }
            }
        }
    }
}

Also, you can refer to this issue for more info, which discusses this usage pattern.

Upvotes: 73

manu prasanth
manu prasanth

Reputation: 199

This works for me

GET /type/_search?pretty=true
{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "outcome",
            "query": {
              "exists": {
                "field": "outcome.outcomeName"
              }
            }
          }
        }
      ]
    }
  }
}

Upvotes: 19

AJP
AJP

Reputation: 28463

With the following index mapping:

{
  "index_name": {
      "mappings": {
        "object_name": {
            "dynamic": "strict",
            "properties": {
              "nested_field_name": {
                  "type": "nested",
                  "properties": {
                    "some_property": {
                        "type": "keyword"
                    }
                  }
              }
            }
        }
      }
  }
}

I needed to use this query:

GET /index_name/_search
{
  "query": {
      "nested": {
        "path": "nested_field_name",
        "query": {
            "bool": {
              "must": [
                  {
                    "exists": {
                        "field": "nested_field_name.some_property"
                    }
                  }
              ]
            }
        }
      }
  }
}

Elasticsearch version 5.4.3

Upvotes: 9

Related Questions