19

I have a list, array or whichever language you are familiar. E.g. names : ["John","Bas","Peter"] and I want to query the name field if it matches one of those names.

One way is with OR Filter. e.g.

{
    "filtered" : {
        "query" : {
            "match_all": {}
        },
        "filter" : {
            "or" : [
                {
                    "term" : { "name" : "John" }
                },
                {
                    "term" : { "name" : "Bas" }
                },
                {
                    "term" : { "name" : "Peter" }
                }
            ]
        }
    }
}

Any fancier way? Better if it's a query than a filter.

Diolor
  • 13,181
  • 30
  • 111
  • 179

3 Answers3

26
{
  "query": {
    "filtered" : {
      "filter" : {
        "terms": {
          "name": ["John","Bas","Peter"]
        }
      }
    }
  }
}

Which Elasticsearch rewrites as if you hat used this one

{
  "query": {
    "filtered" : {
      "filter" : {
        "bool": {
          "should": [
            {
              "term": {
                "name": "John"
              }
            },
            {
              "term": {
                "name": "Bas"
              }
            },
            {
              "term": {
                "name": "Peter"
              }
            }
          ]
        }
      }
    }
  }
}

When using a boolean filter, most of the time, it is better to use the bool filter than and or or. The reason is explained on the Elasticsearch blog: http://www.elasticsearch.org/blog/all-about-elasticsearch-filter-bitsets/

knutwalker
  • 5,924
  • 2
  • 22
  • 29
  • Thanks, so [terms](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-terms-query.html) is what I needed. I put in the query in my case – Diolor Apr 01 '14 at 09:40
  • 2
    `filtered` is now deprecated, see Erfan's answer – Ollie Dec 22 '19 at 22:48
23

As I tried the filtered query I got no [query] registered for [filtered], based on answer here it seems the filtered query has been deprecated and removed in ES 5.0. So I provide using:

{
    "query": {
        "bool": {
            "filter": {
                "terms": {
                    "name": ["John","Bas","Peter"]
                }
            }
        }
    }
}
Erfan Loghmani
  • 607
  • 4
  • 7
0

example query = filter by keyword and a list of values

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "fguid": "9bbfe844-44ad-4626-a6a5-ea4bad3a7bfb.pdf"
                    }
                }
            ],
            "filter": {
                "terms": {
                    "page": [
                        "1",
                        "2",
                        "3"
                    ]
                }
            }
        }
    }
}
mexekanez
  • 266
  • 3
  • 7