Elasticsearch array property must contain given array items Elasticsearch array property must contain given array items elasticsearch elasticsearch

Elasticsearch array property must contain given array items


You need to set the execution mode to "and" by adding "execution": "and" to the terms filter so that all terms must be contained within a document to be considered a match

GET _search{   "query": {      "filtered": {         "query": {            "match_all": {}         },         "filter": {            "terms": {               "tags": [                  "tag1",                  "tag3"               ],               "execution": "and"            }         }      }   }}

This is effectively the same as building a bool must filter with the conjunction of all terms, but in a more compact form.


For those who are looking at this in 2020, you might have noticed that minimum_should_match is deprecated long back.

There is an alternative currently available, which is to use terms_set.

For eg:

{  "query": {    "terms_set": {      "programming_languages": {        "terms": [ "c++", "java", "php" ],        "minimum_should_match_field": "required_matches"      }    }  }}

The above example assumes a field required_matches exists which contains an integer, that defines how many matches should be there.

What is more useful is the alternative field minimum_should_match_script.

See the example below:

{  "query": {    "terms_set": {      "programming_languages": {        "terms": [ "c++", "java", "php" ],        "minimum_should_match_script": {          "source": "2"        },      }    }  }}

You can always use the inside a filter context to make it works a filter.

Read more here


You can set minimum_should_match to match your array:

{    "query": {        "filtered": {           "query": {               "match_all": {}           },           "filter": {               "bool": {                   "must": [                      {                          "terms": {                             "tags": ["tag1","tag3"],                             "minimum_should_match": 2                          }                      }                   ]               }           }       }    }}