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

本文探讨了在Elasticsearch中查询子句于查询上下文和过滤上下文的不同作用。查询上下文不仅判断文档是否匹配,还计算评分;而过滤上下文只做简单匹配判断,用于过滤结构化数据,且频繁使用的过滤上下文会被缓存以提升性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查询上下文和过滤上下文 {#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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值