在上一节中,我们跳过了一些名为文档分数(在搜索结果中的 _score 字段)的细节。score(分数)是一个我们指定搜索后匹配的文档的相对的效果评估的数值型的值。分数越高,文档的相关度更高,分数越低,文档的相关度越低。
并不是所有的查询都需要产生分数,特别是那些仅用于 “filtering”(过滤)的文档。为了不计算分数 Elasticsearch 会自动检查场景并且优化查询的执行。
在上一节中我们介绍的 bool
query 也支持 filter 语句,它可以使用一个查询来限制会被其它语句匹配的文档,而不改变分数是如何计算出来的。举个例子,让我们介绍下 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 查询之外 ,还有很多在这里我们我没有用到的其它有用的查询类型。既然我们对于它们是如何工作的方式有了一个基本的了解,在学习和尝试其它的查询类型中应用这些知识应该不是很难。