# Executing Filters（执行过滤）

原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/5.4/_executing_filters.html](https://www.elastic.co/guide/en/elasticsearch/reference/5.4/_executing_filters.html)

译文链接 : [http://www.apache.wiki/pages/viewpage.action?pageId=4260781](http://www.apache.wiki/pages/viewpage.action?pageId=4260781)

贡献者 : [那伊抹微笑](/display/~wangyangting)，[ApacheCN](/display/~apachecn)，[Apache中文网](/display/~apachechina)

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

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

在上一节中我们介绍的 [`bool` query](https://www.elastic.co/guide/en/elasticsearch/reference/5.0/query-dsl-bool-query.html "Bool Query") 也支持 **filter** 语句，它可以使用一个查询来限制会被其它语句匹配的文档，而不改变分数是如何计算出来的。举个例子，让我们介绍下 [`range` query](https://www.elastic.co/guide/en/elasticsearch/reference/5.0/query-dsl-range-query.html "Range Query")，它可以让我们通过一系列的值过滤文档。这通常用于数字或者日期过滤。

这个例子使用了一个 **bool** 查询来返回余额在 **20000** ~ **30000** 直接的账户（包含 **20000** 和 **30000**）。换言之，我们想要去找出余额大于或等于 **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_all**，**match**，**bool **和 **range** 查询之外 ，还有很多在这里我们我没有用到的其它有用的查询类型。既然我们对于它们是如何工作的方式有了一个基本的了解，在学习和尝试其它的查询类型中应用这些知识应该不是很难。