Executing Filters(执行过滤)

在上一节中,我们跳过了一些名为文档分数(在搜索结果中的 _score  字段)的细节。score(分数)是一个我们指定搜索后匹配的文档的相对的效果评估的数值型的值。分数越高,文档的相关度更高,分数越低,文档的相关度越低。

并不是所有的查询都需要产生分数,特别是那些仅用于 “filtering”(过滤)的文档。为了不计算分数 Elasticsearch 会自动检查场景并且优化查询的执行。

在上一节中我们介绍的 bool query 也支持 filter 语句,它可以使用一个查询来限制会被其它语句匹配的文档,而不改变分数是如何计算出来的。举个例子,让我们介绍下 range query,它可以让我们通过一系列的值过滤文档。这通常用于数字或者日期过滤。

这个例子使用了一个 bool 查询来返回余额在 20000 ~ 30000 直接的账户(包含 2000030000)。换言之,我们想要去找出余额大于或等于 20000 且小于或等于 30000 的账户。

curl -XGET 'localhost:9200/bank/_search?pretty' -d'
{
  "query": {
    "bool": {
      "must": { "match_all": {} },
      "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}'

分析上面的结构,bool 号查询包含了一个 match_all 查询(查询部分),和一个 range(范围)查询(过滤部分)。我们可以将查询和过滤部分替换成任何其它的查询。在上述情况下,范围查询是非常合理的,因为文档落入的所有匹配范围是 “equally”(相等的)。例如,没有文档与其它的东西相关联。

除了 match_allmatchbool 和 range 查询之外 ,还有很多在这里我们我没有用到的其它有用的查询类型。既然我们对于它们是如何工作的方式有了一个基本的了解,在学习和尝试其它的查询类型中应用这些知识应该不是很难。