Query and filter context
editQuery and filter context
editRelevance scores
editBy default, Elasticsearch sorts matching search results by relevance score, which measures how well each document matches a query.
The relevance score is a positive floating point number, returned in the
_score metadata field of the search API. The higher the
_score, the more relevant the document. While each query type can calculate
relevance scores differently, score calculation also depends on whether the
query clause is run in a query or filter context.
Query context
editIn the query context, a query clause answers the question “How well does this
document match this query clause?” Besides deciding whether or not the
document matches, the query clause also calculates a relevance score in the
_score metadata field.
Query context is in effect whenever a query clause is passed to a query
parameter, such as the query parameter in the
search API.
Filter context
editIn a filter context, a query clause answers the question “Does this document match this query clause?” The answer is a simple Yes or No — no scores are calculated. Filter context is mostly used for filtering structured data, e.g.
-
Does this
timestampfall into the range 2015 to 2016? -
Is the
statusfield set to"published"?
Frequently used filters will be cached automatically by Elasticsearch, to speed up performance.
Filter context is in effect whenever a query clause is passed to a filter
parameter, such as the filter or must_not parameters in the
bool query, the filter parameter in the
constant_score query, or the
filter aggregation.
Example of query and filter contexts
editBelow is an example of query clauses being used in query and filter context
in the search API. This query will match documents where all of the following
conditions are met:
-
The
titlefield contains the wordsearch. -
The
contentfield contains the wordelasticsearch. -
The
statusfield contains the exact wordpublished. -
The
publish_datefield contains a date from 1 Jan 2015 onwards.
$params = [
'body' => [
'query' => [
'bool' => [
'must' => [
[
'match' => [
'title' => 'Search',
],
],
[
'match' => [
'content' => 'Elasticsearch',
],
],
],
'filter' => [
[
'term' => [
'status' => 'published',
],
],
[
'range' => [
'publish_date' => [
'gte' => '2015-01-01',
],
],
],
],
],
],
],
];
$response = $client->search($params);
resp = client.search(
body={
"query": {
"bool": {
"must": [
{"match": {"title": "Search"}},
{"match": {"content": "Elasticsearch"}},
],
"filter": [
{"term": {"status": "published"}},
{"range": {"publish_date": {"gte": "2015-01-01"}}},
],
}
}
},
)
print(resp)
response = client.search(
body: {
query: {
bool: {
must: [
{
match: {
title: 'Search'
}
},
{
match: {
content: 'Elasticsearch'
}
}
],
filter: [
{
term: {
status: 'published'
}
},
{
range: {
publish_date: {
gte: '2015-01-01'
}
}
}
]
}
}
}
)
puts response
res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"bool": {
"must": [
{
"match": {
"title": "Search"
}
},
{
"match": {
"content": "Elasticsearch"
}
}
],
"filter": [
{
"term": {
"status": "published"
}
},
{
"range": {
"publish_date": {
"gte": "2015-01-01"
}
}
}
]
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
const response = await client.search({
body: {
query: {
bool: {
must: [
{
match: {
title: 'Search'
}
},
{
match: {
content: 'Elasticsearch'
}
}
],
filter: [
{
term: {
status: 'published'
}
},
{
range: {
publish_date: {
gte: '2015-01-01'
}
}
}
]
}
}
}
})
console.log(response)
GET /_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
|
The |
|
|
The |
|
|
The |
Scores calculated for queries in query context are represented as single precision floating point numbers; they have only 24 bits for significand’s precision. Score calculations that exceed the significand’s precision will be converted to floats with loss of precision.
Use query clauses in query context for conditions which should affect the score of matching documents (i.e. how well does the document match), and use all other query clauses in filter context.