Executing Filters(执行过滤)

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

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

贡献者 : 那伊抹微笑ApacheCNApache中文网

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

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

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

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

  1. curl -XGET 'localhost:9200/bank/_search?pretty' -d'
  2. {
  3. "query": {
  4. "bool": {
  5. "must": { "match_all": {} },
  6. "filter": {
  7. "range": {
  8. "balance": {
  9. "gte": 20000,
  10. "lte": 30000
  11. }
  12. }
  13. }
  14. }
  15. }
  16. }'

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

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