一个查询子句的行为取决于它是处在查询上下文还是过滤上下文。
查询上下文
在查询上下文中的子句用于回答“这个文档有多能满足这个查询子句?”,在决定是否能满足
该查询子句之前,该查询子句都会生成一个_score
来表示一个文档相对于其他文档有多
能满足该查询子句。
过滤上下文
在过滤上下文中,查询子句用于回答“这个文档能满足这个查询子句的条件吗?”,显然,
答案只有是或者不是。也不会为文档打分,过滤上下文大部分时间用于过滤结构化的数据
比如,
- 一个时间是否在2015到2016年之间?
- 一个状态位是否为”published”?
频繁使用的过滤上下文会被ES缓存,用于提升速度。
每当一个查询子句传递给了一个filter参数时,过滤上下文就会生效。比如在bool
查询
中的filter
参数或者must_not
参数,constant_score
查询或者filter
聚合
中的filter
参数
下面是一个查询示例:
GET /_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}