在上一节中,我们跳过了一个称为文档分数的小细节(搜索结果中的_score字段)。分数是一个数值,它是文档与我们指定的搜索查询匹配程度的相对度量。分数越高,文档越相关,分数越低,文档的相关性越低。

    但是查询并不总是需要产生分数,特别是当它们仅用于“过滤”文档集时。Elasticsearch检测这些情况并自动优化查询执行,以便不计算无用的分数。

    我们在上一节中介绍的bool查询还支持过滤子句,这些子句允许我们使用查询来限制将与其他子句匹配的文档,而不会更改计算得分的方式。例如,让我们介绍范围查询,它允许我们按一系列值过滤文档。这通常用于数字或日期过滤。

    此示例使用bool查询返回所有余额介于20000和30000之间的帐户。换句话说,我们希望找到余额大于或等于20000且小于或等于30000的帐户。

    1. GET /bank/_search
    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查询(查询部分)和范围查询(过滤器部分)。我们可以将任何其他查询替换为查询和过滤器部分。在上述情况下,范围查询非常有意义,因为落入该范围的文档都“同等地”匹配,即,没有文档比另一文档更相关。

    除了match_all,match,bool和range查询之外,还有很多其他可用的查询类型,我们不会在这里讨论它们。由于我们已经基本了解它们的工作原理,因此将这些知识应用于学习和试验其他查询类型应该不会太困难。