查询上下文和过滤上下文 {#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
当关注影响匹配文档的评分(即,文档的匹配程度)的条件时,
使用查询上下文,其他情况使用过滤上下文。
本文探讨了在Elasticsearch中查询子句于查询上下文和过滤上下文的不同作用。查询上下文不仅判断文档是否匹配,还计算评分;而过滤上下文只做简单匹配判断,用于过滤结构化数据,且频繁使用的过滤上下文会被缓存以提升性能。
385

被折叠的 条评论
为什么被折叠?



