执行过滤

在前面的章节中,我们跳过了文档得分的细节(搜索结果中的_score字段)。分数是一个数字值,是一个测量文本与查询条件匹配度的相对值。得分越高,文档越相关,得分越低文档的相关度越低。

但并不是所有的查询都需要计算得分,特别是在只过滤文档集的场景中。对于那些我们不需要相关度得分的场景下,Elasticsearch会探测与自动优化查询的执行过程,不计算无用的分数。

在前面的章节中我们介绍的布尔查询](../..//Query_DSL/Compound_queries/Bool_Query.md)同样也支持过滤子句的语法,在不改变得分的情况下,他使得查询请求返回的文档会被另一个条件进一步筛选。下面的示例,我们介绍一下范围查询,它允许我们根据一个值得范围来过滤文档,它只能用的数字与日期类型的过滤上。

这个示例演示了使用一个布尔查询来返回账户余额在20000与30000之间的所有账户信息(包括20000与30000)。换句话说,我们想要找到账户余额大于等于20000并且小于等于30000的账户。

GET /bank/_search
{
  "query": {
    "bool": {
      "must": { "match_all": {} },
      "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}

分析上面的例子,被过滤的查询包含一个match_all查询(query部分)和一个range查询(filter部分)。我们可以用其它的条件来替换queryfilter部分的内容。在上面的应用场景中,范围查询的最大意义在于:所有的在这个范围之内的文档都是平等的(或者说相关度都是一样的),没有一个文档比另一个文档更相关。

除了match_all, match, bool,filteredrange查询,还有很多其它类型的查询,我们这里不会涉及。由于我们已经对它们的工作原理有了基本的理解,将其应用到其它类型的查询、过滤器上也不是件难事。

© ApacheCN Team all right reserved,powered by Gitbook该文件修订于: 2018-03-13 09:41:17

results matching ""

    No results matching ""