WARNING: Version 1.4 of Elasticsearch has passed its EOL date.
This documentation is no longer being maintained and may be removed. If you are running this version, we strongly advise you to upgrade. For the latest information, see the current release documentation.
Filtered Query
editFiltered Query
editThe filtered
query is used to combine another query with any
filter. Filters are usually faster than queries because:
-
they don’t have to calculate the relevance
_score
for each document — the answer is just a boolean “Yes, the document matches the filter” or “No, the document does not match the filter”. - the results from most filters can be cached in memory, making subsequent executions faster.
Exclude as many document as you can with a filter, then query just the documents that remain.
{ "filtered": { "query": { "match": { "tweet": "full text search" } }, "filter": { "range": { "created": { "gte": "now - 1d / d" }} } } }
The filtered
query can be used wherever a query
is expected, for instance,
to use the above example in search request:
curl -XGET localhost:9200/_search -d ' { "query": { "filtered": { "query": { "match": { "tweet": "full text search" } }, "filter": { "range": { "created": { "gte": "now - 1d / d" }} } } } } '
Filtering without a query
editIf a query
is not specified, it defaults to the
match_all
query. This means that the
filtered
query can be used to wrap just a filter, so that it can be used
wherever a query is expected.
Multiple filters
editMultiple filters can be applied by wrapping them in a
bool
filter, for example:
{ "filtered": { "query": { "match": { "tweet": "full text search" }}, "filter": { "bool": { "must": { "range": { "created": { "gte": "now - 1d / d" }}}, "should": [ { "term": { "featured": true }}, { "term": { "starred": true }} ], "must_not": { "term": { "deleted": false }} } } } }
Similarly, multiple queries can be combined with a
bool
query.
Filter strategy
editYou can control how the filter and query are executed with the strategy
parameter:
{ "filtered" : { "query" : { ... }, "filter" : { ... }, "strategy": "leap_frog" } }
This is an expert-level setting. Most users can simply ignore it.
The strategy
parameter accepts the following options:
|
Look for the first document matching the query, and then alternatively advance the query and the filter to find common matches. |
|
Look for the first document matching the filter, and then alternatively advance the query and the filter to find common matches. |
|
Same as |
|
If the filter supports random access, then search for documents using the
query, and then consult the filter to check whether there is a match.
Otherwise fall back to |
|
If the filter supports random access and if there is at least one matching
document among the first |
|
Apply the filter first if it supports random access. Otherwise fall back
to |
The default strategy is to use query_first
on filters that are not
advanceable such as geo filters and script filters, and random_access_100
on
other filters.