在前边的部分,我们跳过了一个叫做document score(搜索结果中的_score字段)。分数(score)是一个数值,它是文档与我们指定的搜索查询匹配程度的相对度量值。分数越高,文档越相关,得分越低,文档的相关性越小。
但查询并不总是需要产生分数,特别是当它们只用于“过滤”文档集时。Elasticsearch检测这些情况并自动优化查询执行为了不计算无用的分数。
我们在上一节中介绍的布尔查询也支持筛选字句,允许在不适用分数计算的情况下,使用查询限制被其他字句匹配的文档。作为一个例子,让我们引入范围查询,这使我们能过根据值得范围来过滤文档。通常用于过滤数字或者日期。
这个例子使用布尔查询返回所有balances介于20000和30000之间的accounts。换句话讲,我们想要找出所有balance大于等于20000并且小于等于30000的accounts记录。
GET /bank/_search { "query": { "bool": { "filter": { "range": { "balance": { "gte": 20000, "lte": 30000 } } }, "must": { "match_all": {} } } } }
分析以上,布尔查询包含一个match_all查询(查询部分)和一个范围查询(过滤部分)。我们可以用任何其他查询替换查询(query)和过滤(filter)部分。在上述情况下,范围查询是完全由道理的,因为所有的文档都在范围内,没有哪个文档比其他更相关(结果内的文档的相关度是等同的)。
除了match_all, match, bool以及range查询,还有其他的可用的查询类型,我们在此不再详解。因为我们已经对于他们的工作原理有了基础的了解,那么将这些知识应用于其他类型的查询并非难事。
本文系本人根据官方文档的翻译,能力有限、水平一般,如果对想学习Elasticsearch的朋友有帮助,将是本人的莫大荣幸。
原文出处:https://www.elastic.co/guide/en/elasticsearch/reference/current/_executing_filters.html