filter context与query context

在 ES 中,提供了 Query 和 Filter 两种搜索:

  • Query Context:会对搜索进行相关性算分
  • Filter Context: 不需要相关性算分,能够利用缓存来获得更好的性能

Query Context

在 query context 中,查询子句回答 “此文档与该查询子句的匹配程度如何” 的问题。除了确定文档是否匹配外,查询子句还计算 _score 字段中的相关性得分。

每当将查询子句传递到 query 参数(例如 search API 中的 query 参数)时,query context 即生效。例如:

image-20220716165859544

Filter Context

filter context 中,查询子句回答问题 “此文档是否与此查询子句匹配?” 答案是简单的 “是” 或 “否” ,即不计算分数。 filter context 主要用于过滤结构化数据,例如

此时间戳记是否在2015年到2016年之间?
状态字段设置为“已发布”吗?

每当将查询子句传递到 filter 参数(例如 bool 查询中的 filter 或 must_not 参数,constant_score 查询中的 filter 参数或 filter 聚合)时,filter context 即生效。

例如:

GET /products/_search
{
  "query": {
     "bool": {
       "filter": {
         "term": {
           "name": "pasta"
         }
       }
     }
  }
}

image-20220716165316088

通过查询结果中可以看到 _score 都是 0。