59

What is the best way to check if a field of a document in elasticsearch exists? I can't find anything in the documentation.

For example if this document doesn't have the field/key "price" I don't want to return in the result.

{
    "updated": "2015/09/17 11:27:27",
     "name": "Eye Shadow",
     "format": "1.5 g / 0.05 oz",
}

What I can do?

5 Answers 5

79

You can use the exists filter combined with a bool/must filter like this:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "exists": {
                "field": "price"
              }
            },
            ...     <-- your other constraints, if any
          ]
        }
      }
    }
  }
}

DEPRECATED (since ES5) You can also use the missing filter combined with a bool/must_not filter:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must_not": [
            {
              "missing": {
                "field": "price"
              }
            }
          ]
        }
      }
    }
  }
}
Sign up to request clarification or add additional context in comments.

5 Comments

But exists is not like IS NULL of SQL? if doesn't check the "field" it checks the value of the field. Perhaps I have missunderstood the docs. @Val
If your document doesn't have a price field, then it cannot have a price value either, so the document without price field will not be matched.
Val yes I could do it, It was a problem with my data and as well I wasmissunderstanding the documentation. It's working. Thanks @Val.
this is now deprecated. please check @Devi's answer
@Dexter missing is deprecated, but not exists
31

The exists filter has been replaced by exists query from ES 2.1, though the working of it is the same. Also, the missing filter is removed and missing query deprecated.

To get all docs which have a particular field,

"bool": {
    "must": {
        "exists": {
            "field": "my_field"
        }
    }
}

and to get all docs which does NOT have a particular field, use it with must_not like this

"bool": {
    "must_not": {
        "exists": {
            "field": "my_field"
        }
    }
}

Elastic docs: https://www.elastic.co/guide/en/elasticsearch/reference/2.3/query-dsl-missing-query.html

Comments

26

You can directly do

{
    "query": {
        "exists": {
            "field": "fieldName"
        }
    }
}

If you wanna add some match too, then you can go for

{
    "query": {
        "bool": {
            "must": [{
                "match": {
                    "fieldName": "value"
                }
            },
            {
                "exists": {
                    "field": "fieldName"
                }
            }]
        }
    }
}

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-exists-query.html

Comments

9

You can use exists filter:

{
  "query": {
    "filtered": {
      "filter": {
        "exists": {
          "field": "status"
        }
      },
      "query": {
        "match_all": {}
      }
    }
  }
}

Regards, Alain

Comments

8
GET /_search
{
    "query": {
        "exists" : { "field" : "price" }
    }
}

source: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-exists-query.html

1 Comment

this is the right one for the latest 7.16 version

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.