查询和过滤器上下文

查询子句的行为取决于它是在查询上下文中使用还是在过滤器上下文中使用:

查询上下文

查询上下文中使用的查询子句回答了“这个文档与这个查询子句的匹配程度如何?”,除了决定文档是否匹配之外,查询子句还计算一个表示文档匹配程度的_score,相对于其他文档。

当查询子句被传递给query参数时,查询上下文就生效,例如search API中的query参数。

过滤器上下文

在过滤器上下文中,查询子句回答了“这个文档与这个查询子句匹配吗?”,答案很简单,是或者不是 - 没有计算分数,过滤器上下文主要用于过滤结构化数据,例如:

  • 这个timestamp属于2015年到2016年的范围吗?
  • status字段是否设置为"published"?

频繁使用的过滤器将自动通过Elasticsearch缓存,以提高性能。

当查询子句被传递给filter参数时,过滤器上下文就生效,例如bool查询中的filtermust_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参数表示过滤器上下文。
  • termrange子句用于过滤器上下文,他们会过滤掉不匹配的文档,但不会影响匹配文档的分数。
在查询上下文中使用查询子句来处理可能影响匹配文档得分的条件(即文档匹配的程度),并在过滤器上下文中使用所有其他查询子句。

博弈
2.5k 声望1.5k 粉丝

态度决定一切