elasticsearch6.6文档翻译-查询语句-查询上下文和过滤上下文

查询上下文和过滤上下文 {#query-filter-context}

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

查询上下文

一个查询子句在查询上下文中被使用时,能够解答这个文档和查询子句的匹配程度是怎样的?
除了决定文档是否匹配,还会计算一个评分,来代表与其他文档比起来,这个文档的匹配程度。

只要查询子句传入一个查询参数(例如 search
API 中的查询参数), 查询上下文就会生效。

过滤上下文

在过滤上下文中,一个查询子句是用来回答
``这个文档匹配这个查询子句吗?’’ 这种问题的,
这个答案是一个简单的 ‘是’ 或者 ‘不是’
,没有评分会被计算。过滤上下文大多的被用来过滤结构化的数据,
比如下面:

  • 这个时间戳是否在2015到2016区间内?

  • status 字段是否被设置为 “published” ?

频繁被使用的过滤上下文将会被 Elasticsearch 自动的缓存,以提升性能。

只要查询子句传入 filter 参数(例如 bool
查询中的 filter 参数或 must_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
    子句被使用在过滤上下文中。它们将会过滤掉不满足它们条件的文档,但是它们不会影响文档的评分。

Tip

当关注影响匹配文档的评分(即,文档的匹配程度)的条件时,
使用查询上下文,其他情况使用过滤上下文。

发布了19 篇原创文章 · 获赞 16 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/matt8/article/details/88089487