查询和过滤上下文(Query and filter context)
在Elasticsearch中,一个查询语句的行为取决于它是使用查询上下文(query context)还是过滤上下文(query context)。
查询上下文(Query context)
在查询上下文中,一个查询语句着重要解决的问题是:查询的文档和这个查询语句有多么的匹配(也就是匹配的程度
)。查询的结果,除了查询语句是否和文档匹配外,查询语句还会计算一个分数(_score),以此来展现相对于其他文档来说和这个文档是有多么的匹配。
当一个查询语句传入查询参数查询上下文才会生效,比如[查询API中]的查询参数。
过滤上下文(Filter context)
在过滤上下文中,一个查询语句着重要解决的问题是:文档和查询语句是否匹配
。这是一个简单的是或者不是的问题 —— 并不会计算得分。过滤上下文大多被用来过滤结构化的数据,比如:
- timestamp是否落在2015 ~ 2016范围内?
- status字段是否被设置为”published”?
通常使用过滤上下文会被搜索引擎自动缓存,从而提升速度性能。
过滤上下文在查询语句中传入filter参数时生效,比如bool查询中的filter或者 must_not参数,以及constant_score查询中的filter参数,或者filter aggregation。
以下是查询API中应用查询和过滤上下文的一个查询语句。此查询会匹配满足如下条件的文档:
- title字段包含单词”search”;
- content字段包含单词”elasticsearch”;
- status字段恰好包含单词”published”;
- publish_date字段日期范围大于等于2015-01-01;
GET _search
{
"query": {①
"bool": {②
"must": [
{ "match": { "title": "Search" }}, ③
{ "match": { "content": "Elasticsearch" }} ④
],
"filter": [ ⑤
{ "term": { "status": "published" }}, ⑥
{ "range": { "publish_date": { "gte": "2015-01-01" }}} ⑦
]
}
}
}
①这个参数指明了一个查询上下文。
②③④查询上下文中使用的bool和两个match语句表明这是要对文档的匹配程度进行评分的。
⑤这个参数指明了一个filter上下文。
⑥⑦term和range语句是用在filter上下文中的。他们会过滤掉文档中不匹配的内容,但是他们不会对文档的评分起作用。
Tips:
当关注匹配的得分(即,与文档的匹配程度时)时在查询语句中使用查询上下文(query context),其他情况下,在查询语句中使用过滤上下文。
参考文章:
- https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html;
- https://www.elastic.co/guide/en/elasticsearch/guide/current/_queries_and_filters.html;