Elasticsearch query和filter过滤有什么不同

it2025-07-13  2

1. 概述

在使用DSL进行Elasticsearch的查询中,通常我们都是使用query进行过滤匹配,比如下面这段代码

GET /my_index/_search { "query": { "match": { "name": "张三" } } }

除此之外,ES还提供了filter过滤,二者都是提供过滤查询的功能。很多人对此比较疑惑,ES这样设计有什么目的?下面我们就讲讲他们之间的区别。

2. 二者关注的点不同

query关注的是搜索条件与索引数据之间的匹配程度,在返回的查询结果,会带出一个浮点型的_score字段,表示匹配程度的得分值。_score越高,数据就越匹配,默认也会排在更前面。

filter关注的是搜索条件与索引数据是否匹配,要么匹配然后返回,要么不匹配直接不返回,没有所谓的匹配程度这个概念,因此查询结果也没有_score这个字段。

这边给一个官方文档提供的例子,来进一步比较他们的不同

①:声明query查询上下文 ②:声明bool查询,以及创建2个match过滤,因此查询结果会计算与这2个match条件的匹配程度,也就是_score值 ③:声明filter查询,分别创建term、range过滤。注意:这2个条件不会影响上一步的_score值

4. 总结

对于需要计算得分,需要计算匹配程度的,使用 query 过滤;反之,对于精确匹配的条件,使用 filter 过滤。(官方文档也是建议这样使用)filter 比 query 性能会更好,因为它不用计算匹配程度。
最新回复(0)