🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 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** 查询之外 ,还有很多在这里我们我没有用到的其它有用的查询类型。既然我们对于它们是如何工作的方式有了一个基本的了解,在学习和尝试其它的查询类型中应用这些知识应该不是很难。