欢迎光临
一个有态度、有温度的分享型博客

Elasticsearch之Query and Filter context

查询和过滤上下文(Query and filter context)

在Elasticsearch中,一个查询语句的行为取决于它是使用查询上下文(query context)还是过滤上下文(query context)。

查询上下文(Query context)

在查询上下文中,一个查询语句着重要解决的问题是:查询的文档和这个查询语句有多么的匹配(也就是匹配的程度)。查询的结果,除了查询语句是否和文档匹配外,查询语句还会计算一个分数(_score),以此来展现相对于其他文档来说和这个文档是有多么的匹配。

当一个查询语句传入查询参数查询上下文才会生效,比如[查询API中]的查询参数。

过滤上下文(Filter context)

在过滤上下文中,一个查询语句着重要解决的问题是:文档和查询语句是否匹配。这是一个简单的是或者不是的问题 —— 并不会计算得分。过滤上下文大多被用来过滤结构化的数据,比如:

  • timestamp是否落在2015 ~ 2016范围内?
  • status字段是否被设置为”published”?

通常使用过滤上下文会被搜索引擎自动缓存,从而提升速度性能。
过滤上下文在查询语句中传入filter参数时生效,比如bool查询中的filter或者 must_not参数,以及constant_score查询中的filter参数,或者filter aggregation
以下是查询API中应用查询和过滤上下文的一个查询语句。此查询会匹配满足如下条件的文档:

  • title字段包含单词”search”;
  • content字段包含单词”elasticsearch”;
  • status字段恰好包含单词”published”;
  • publish_date字段日期范围大于等于2015-01-01;
GET _search
{
  "query": {①
     "bool": {②
        "must": [
        { "match": { "title":   "Search"        }}, ③
        { "match": { "content": "Elasticsearch" }}  ④
      ],
      "filter": [ ⑤
        { "term":  { "status": "published" }}, ⑥
        { "range": { "publish_date": { "gte": "2015-01-01" }}} ⑦
      ]
    }
  }
}

①这个参数指明了一个查询上下文。

②③④查询上下文中使用的bool和两个match语句表明这是要对文档的匹配程度进行评分的。

⑤这个参数指明了一个filter上下文。

⑥⑦term和range语句是用在filter上下文中的。他们会过滤掉文档中不匹配的内容,但是他们不会对文档的评分起作用。

Tips:
当关注匹配的得分(即,与文档的匹配程度时)时在查询语句中使用查询上下文(query context),其他情况下,在查询语句中使用过滤上下文。

参考文章:

  1. https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html;
  2. https://www.elastic.co/guide/en/elasticsearch/guide/current/_queries_and_filters.html;
转载请注明出处:容休博客 » Elasticsearch之Query and Filter context

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址