Use filter context instead of query context if possible.
如果可能,请使用filter过滤器上下文而不是query查询上下文。
在Elasticsearch(简称ES)中,"query"和"filter"是两种不同类型的查询操作,它们在搜索时有不同的用途和特点:
- Query:
- 用途: 主要用于全文搜索,可以返回相关性得分,即结果的排序依据。Query查询通常用于需要根据搜索词的相关性进行排序的场景。
- 性能: Query查询可能会使用倒排索引,但是它可能会对得分进行计算,这可能会稍微降低查询性能。
- 使用场景: 当你想要找到与搜索词最相关的文档时使用,例如搜索文章、博客帖子等。
- Filter:
- 用途: 主要用于结构化数据的搜索,不返回相关性得分,结果通常是按照索引顺序返回的。Filter查询通常用于不需要排序,只关心是否存在的场景。
- 性能: Filter查询通常使用位数组(bit set)来加速查询,因此它们通常比Query查询更快。
- 使用场景: 当你想要快速检索满足特定条件的文档,而不需要考虑相关性得分时使用,例如过滤出所有价格在某个范围内的商品。
- 结合使用:
- 在实际应用中,Query和Filter经常结合使用。你可以使用Filter来快速缩小搜索范围,然后使用Query来对结果进行相关性排序。
- 缓存:
- Filter查询的结果可以被缓存,这意味着如果相同的Filter查询被执行多次,ES可以利用缓存来提高性能。而Query查询由于涉及到相关性得分的计算,通常不会被缓存。
- 数据类型:
- Query通常用于分析型的数据,如文本字段,而Filter则适用于结构化数据,如数值、日期等字段。
总结来说,Query和Filter在ES中有不同的使用场景和性能特点,Query更侧重于相关性得分和全文搜索,而Filter则侧重于快速检索和结构化数据的筛选。
使用场景:
- 全文检索以及任何使用相关性评分的场景使用query检索。
- 除此之外的其他使用filter过滤器过滤。
ES高版本(2.X/5.X/6.x以后),任何查询子句都可以在“查询上下文query”中用作查询,并在“过滤器上下文filter”中用作过滤器。
No comments yet.