在 Elasticsearch(ES) 中,Filter 和 Query 是两种常用的数据检索方式,它们的主要区别在于 是否计算相关性分数(Score) 以及 是否使用缓存。以下是它们的详细区别和应用场景:
1. 核心区别
特性 | Filter(过滤器) | Query(查询) |
---|---|---|
相关性分数 | 不计算分数,只判断文档是否匹配。 | 计算分数,用于衡量文档与查询的相关性。 |
性能 | 性能更高,适合精确匹配。 | 性能较低,适合全文检索。 |
缓存 | 结果会被缓存,重复查询时更快。 | 结果不会被缓存。 |
使用场景 | 精确匹配(如范围查询、Term 查询)。 | 全文检索(如 Match 查询)。 |
排序 | 不参与排序。 | 参与排序(基于分数)。 |
2. 详细说明
(1)Filter(过滤器)
-
特点:
-
只判断文档是否匹配,不计算相关性分数。
-
结果会被缓存,适合重复查询的场景。
-
性能更高,因为不需要计算分数。
-
-
使用场景:
-
精确匹配(如 Term 查询、Range 查询)。
-
布尔条件判断(如
must
、should
、must_not
)。 -
过滤不需要排序的数据。
-
-
示例:
json
复制
{ "query": { "bool": { "filter": [ { "term": { "status": "active" } }, { "range": { "age": { "gte": 18, "lte": 30 } } } ] } } }
(2)Query(查询)
-
特点:
-
计算文档与查询的相关性分数(Score)。
-
结果不会被缓存。
-
适合全文检索和模糊匹配。
-
-
使用场景:
-
全文检索(如 Match 查询)。
-
需要排序的场景(基于分数)。
-
模糊匹配(如 Fuzzy 查询)。
-
-
示例:
json
复制
{ "query": { "match": { "title": "elasticsearch" } } }
3. Filter 和 Query 的结合使用
在实际应用中,Filter 和 Query 通常会结合使用,以兼顾性能和相关性。例如:
-
使用 Filter 过滤掉不符合条件的文档。
-
使用 Query 对剩余文档计算相关性分数。
示例:
json
复制
{
"query": {
"bool": {
"must": [
{ "match": { "title": "elasticsearch" } } // Query
],
"filter": [
{ "term": { "status": "active" } }, // Filter
{ "range": { "age": { "gte": 18 } } } // Filter
]
}
}
}
-
must
:用于 Query,计算相关性分数。 -
filter
:用于 Filter,不计算分数,但会缓存结果。
4. 性能对比
-
Filter:
-
性能更高,适合精确匹配。
-
结果缓存可以显著提升重复查询的性能。
-
-
Query:
-
性能较低,因为需要计算相关性分数。
-
适合全文检索和排序场景。
-
5. 总结
-
Filter:
-
适合精确匹配和过滤场景。
-
不计算分数,性能更高,结果会被缓存。
-
-
Query:
-
适合全文检索和排序场景。
-
计算分数,性能较低,结果不会被缓存。
-
-
结合使用:
- 在实际应用中,通常将 Filter 和 Query 结合使用,以兼顾性能和相关性。
通过合理使用 Filter 和 Query,可以显著提升 Elasticsearch 的查询性能和准确性。