查询上下文和过滤上下文 {#query-filter-context}
查询子句的行为取决于它是在查询上下文中使用,还是在过滤上下文中使用:
- 查询上下文
-
一个查询子句在查询上下文中被使用时,能够解答这个文档和查询子句的匹配程度是怎样的?
除了决定文档是否匹配,还会计算一个评分,来代表与其他文档比起来,这个文档的匹配程度。只要查询子句传入一个查询参数(例如
search
API 中的查询参数), 查询上下文就会生效。 - 过滤上下文
-
在过滤上下文中,一个查询子句是用来回答
``这个文档匹配这个查询子句吗?’’ 这种问题的,
这个答案是一个简单的 ‘是’ 或者 ‘不是’
,没有评分会被计算。过滤上下文大多的被用来过滤结构化的数据,
比如下面:-
这个时间戳是否在2015到2016区间内?
-
status 字段是否被设置为 “published” ?
频繁被使用的过滤上下文将会被 Elasticsearch 自动的缓存,以提升性能。
只要查询子句传入
filter
参数(例如bool
查询中的filter
参数或must_not
参数,constant_score
查询中的
filter
参数,或者聚合中的
filter
),
过滤上下文就会生效。 -
下面是一个 search
API
中,查询子句被使用在查询上下文和过滤上下文中的例子。
这个查询会匹配满足下面所有条件的文档:
-
title
字段包含单词search
。 -
content
字段包含单词elasticsearch
。 -
status
字段包含完整的单词published
。 -
publish_date
日期字段范围大于等于2015年1月1日。
GET /_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
-
query
参数指明这是查询上下文。 -
bool
和两个match
子句被使用在查询上下文中,这意味着他们会被用来给每个文档的匹配程度计算评分。 -
filter
参数指明这是过滤上下文。 -
term
和range
子句被使用在过滤上下文中。它们将会过滤掉不满足它们条件的文档,但是它们不会影响文档的评分。
Tip
当关注影响匹配文档的评分(即,文档的匹配程度)的条件时,
使用查询上下文,其他情况使用过滤上下文。