Queries vs. Filters
The difference is simple: filters are cached and don't influence the score, therefore faster than queries. Have a look here too. Let's say a query is usually something that the users type and pretty much unpredictable, while filters help users narrowing down the search results , for example using facets.
This is what official documentation says:
As a general rule, filters should be used instead of queries:
- for binary yes/no searches
- for queries on exact values
As a general rule, queries should be used instead of filters:
- for full text search
- where the result depends on a relevance score
An example (try it yourself)
Say index myindex
contains three documents:
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hello world!" }'curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hello world! I am Sam." }'curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hi Stack Overflow!" }'
Query: How well a document matches the query
Query hello sam
(using keyword must
)
curl localhost:9200/myindex/_search?pretty -d '{ "query": { "bool": { "must": { "match": { "msg": "hello sam" }}}}}'
Document "Hello world! I am Sam."
is assigned a higher score than "Hello world!"
, because the former matches both words in the query. Documents are scored.
"hits" : [ ... "_score" : 0.74487394, "_source" : { "name" : "Hello world! I am Sam." } ... "_score" : 0.22108285, "_source" : { "name" : "Hello world!" } ...
Filter: Whether a document matches the query
Filter hello sam
(using keyword filter
)
curl localhost:9200/myindex/_search?pretty -d '{ "query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}}'
Documents that contain either hello
or sam
are returned. Documents are NOT scored.
"hits" : [ ... "_score" : 0.0, "_source" : { "name" : "Hello world!" } ... "_score" : 0.0, "_source" : { "name" : "Hello world! I am Sam." } ...