Query and filter context
查询子句的行为依赖于它是否在查询上下文或者过滤器上下文:
查询上下文
在查询上下文中使用的查询子句回答了“此文档与此查询子句匹配程度”的问题。除了决定文档是否匹配之外,查询子句还会计算一个_score,表示此文档和其它文档的匹配程度。
只要当查询子句传递给一个查询参数(如search API中的查询参数),查询上下文就生效。
过滤器上下文
在过滤器上下文中,一个查询子句回答了“此文档是否匹配此查询子句?”的问题。该答案是简单的“Yes”或“No”—没有scores被计算。过滤器上下文主要用来过滤结构性数据,例如:
-
- 此timestamp是否落在2015到2016之间?
- status字段是否设置为“published”?
频繁使用的过滤器将被Elasticsearch自动缓存,以提升性能。
当查询子句传递一个过滤器参数时,过滤器上下文就生效,如在bool查询中的filter或者must_not参数,在constant_score查询中的filter参数或filter集合。
下面是search API中被使用在查询或过滤器上下文的一个查询子句的例子。该查询将匹配所有以下条件被满足的文档:
- title字段中包含search单词。
- content字段中包含elasticsearch单词。
- status字段中包含精确的published单词。
- publish_data包含从2015年1月1日起的日期。
GET /_search
{
"query": {
![](https://www.elastic.co/guide/en/elasticsearch/reference/current/images/icons/callouts/1.png)
"bool": {
![](https://www.elastic.co/guide/en/elasticsearch/reference/current/images/icons/callouts/2.png)
"must": [
{ "match": { "title": "Search" }},
![](https://www.elastic.co/guide/en/elasticsearch/reference/current/images/icons/callouts/3.png)
{ "match": { "content": "Elasticsearch" }}
![](https://www.elastic.co/guide/en/elasticsearch/reference/current/images/icons/callouts/4.png)
],
"filter": [
![](https://www.elastic.co/guide/en/elasticsearch/reference/current/images/icons/callouts/5.png)
{ "term": { "status": "published" }},
![](https://www.elastic.co/guide/en/elasticsearch/reference/current/images/icons/callouts/6.png)
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
![](https://www.elastic.co/guide/en/elasticsearch/reference/current/images/icons/callouts/7.png)
]
}
}
}
query参数表示查询上下文。
在查询上下文中使用bool和两个match子句,这意味着它们被用于评估每个文档的匹配程度。
filter参数表示过滤器上下文
在过滤器上下文中使用的term和range子句。它们会过滤出不符合的文件,但不会影响匹配文件的得分。
小提示:在查询上下文中使用查询子句,这些条件应影响匹配文档的分数(即文档的匹配程度),并使用过滤器上下文中的所有其他查询子句。
原文地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html