在前面的章节中,我们跳过了文档得分的细节(搜索结果中的_score
字段)。分数是一个数字值,是一个测量文本与查询条件匹配度的相对值。得分越高,文档越相关,得分越低文档的相关度越低。
但并不是所有的查询都需要计算得分,特别是在只过滤文档集的场景中。对于那些我们不需要相关度得分的场景下,Elasticsearch会探测与自动优化查询的执行过程,不计算无用的分数。
在前面的章节中我们介绍的布尔查询](../..//Query_DSL/Compound_queries/Bool_Query.md)同样也支持过滤
子句的语法,在不改变得分的情况下,他使得查询请求返回的文档会被另一个条件进一步筛选。下面的示例,我们介绍一下范围查询,它允许我们根据一个值得范围来过滤文档,它只能用的数字与日期类型的过滤上。
这个示例演示了使用一个布尔查询来返回账户余额在20000与30000之间的所有账户信息(包括20000与30000)。换句话说,我们想要找到账户余额大于等于20000并且小于等于30000的账户。
GET /bank/_search
{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}
分析上面的例子,被过滤的查询包含一个match_all
查询(query
部分)和一个range
查询(filter
部分)。我们可以用其它的条件来替换query
与filter
部分的内容。在上面的应用场景中,范围查询的最大意义在于:所有的在这个范围之内的文档都是平等的(或者说相关度都是一样的),没有一个文档比另一个文档更相关。
除了match_all
, match
, bool
,filtered
和range
查询,还有很多其它类型的查询,我们这里不会涉及。由于我们已经对它们的工作原理有了基本的理解,将其应用到其它类型的查询、过滤器上也不是件难事。