Use filter context instead of query context if possible.

如果可能,请使用filter过滤器上下文而不是query查询上下文。

在Elasticsearch(简称ES)中,"query"和"filter"是两种不同类型的查询操作,它们在搜索时有不同的用途和特点:

  1. Query:
    • 用途: 主要用于全文搜索,可以返回相关性得分,即结果的排序依据。Query查询通常用于需要根据搜索词的相关性进行排序的场景。
    • 性能: Query查询可能会使用倒排索引,但是它可能会对得分进行计算,这可能会稍微降低查询性能。
    • 使用场景: 当你想要找到与搜索词最相关的文档时使用,例如搜索文章、博客帖子等。
  2. Filter:
    • 用途: 主要用于结构化数据的搜索,不返回相关性得分,结果通常是按照索引顺序返回的。Filter查询通常用于不需要排序,只关心是否存在的场景。
    • 性能: Filter查询通常使用位数组(bit set)来加速查询,因此它们通常比Query查询更快。
    • 使用场景: 当你想要快速检索满足特定条件的文档,而不需要考虑相关性得分时使用,例如过滤出所有价格在某个范围内的商品。
  3. 结合使用:
    • 在实际应用中,Query和Filter经常结合使用。你可以使用Filter来快速缩小搜索范围,然后使用Query来对结果进行相关性排序。
  4. 缓存:
    • Filter查询的结果可以被缓存,这意味着如果相同的Filter查询被执行多次,ES可以利用缓存来提高性能。而Query查询由于涉及到相关性得分的计算,通常不会被缓存。
  5. 数据类型:
    • Query通常用于分析型的数据,如文本字段,而Filter则适用于结构化数据,如数值、日期等字段。

总结来说,Query和Filter在ES中有不同的使用场景和性能特点,Query更侧重于相关性得分和全文搜索,而Filter则侧重于快速检索和结构化数据的筛选。

使用场景:

  • 全文检索以及任何使用相关性评分的场景使用query检索。
  • 除此之外的其他使用filter过滤器过滤。

ES高版本(2.X/5.X/6.x以后),任何查询子句都可以在“查询上下文query”中用作查询,并在“过滤器上下文filter”中用作过滤器。