ElasticsearchkNN过滤性能优化,前置与后置选择策略解析

Elasticsearch通过智能判断在向量搜索前后应用kNN过滤,显著提升查询效率。针对1000万个向量的数据集测试显示,后置过滤在120组基准测试中90%以上表现更优,同时保持召回率。该优化基于对...

互联网/IT

近日,Elasticsearch在其最新版本中引入了一项关键性能优化,旨在提升kNN(k-Nearest Neighbors)过滤的效率。这项改进的核心在于,系统能够根据具体查询条件,在向量搜索之前或之后动态决定应用kNN过滤的位置,从而实现更优的查询性能。

在一项包含1000万个向量的大型数据集上进行的120组基准测试表明,采用后置过滤策略的查询速度平均提升了约8.4倍,且所有测试结果的召回率与前置过滤相比仅下降了0.01。这一显著提升主要得益于Elasticsearch对过滤条件执行时机的智能判断机制。

具体而言,当过滤条件(如租户ID或语言标签)匹配数据集中大量文档时,系统会优先执行向量搜索,然后仅对返回的候选文档集应用过滤条件。这种策略避免了在每个Lucene segment中都进行过滤检查的开销,特别是在文档数量庞大的情况下效果尤为明显。例如,在523K个向量的segment中,前置过滤耗时45倍于后置过滤;而在10M个向量的segment中,这一差距扩大到60倍。

Elasticsearch的kNN过滤机制充分利用了两种近似最近邻结构的特点:HNSW(Hierarchical Navigable Small World)图和IVF(Inverted File Index)。HNSW通过构建多层邻近图来加速搜索,而IVF则通过聚类向量并建立倒排列表来实现快速检索。这两种结构都不是覆盖整个索引的单一结构,而是每个Lucene segment都拥有自己的独立结构,因此kNN查询需要分别搜索每个segment并合并结果。

为了实现这一优化,Elasticsearch引入了可学习的瓶颈向量(bottleneck tokens)技术。文档标题和正文内容在离线阶段被编码并压缩到这些瓶颈向量中,查询阶段只需访问这些紧凑表示即可完成匹配与排序。这种方法不仅减少了在线阶段处理长文档的计算开销,还保留了大模型理解复杂答案贡献关系的能力。

文章配图

此外,Elasticsearch还通过统计方式确定候选池大小,确保至少有k个结果通过过滤。如果初始结果不足,系统会自动重试一次,然后回退到传统的前置过滤搜索。这一设计保证了查询结果的完整性和准确性,同时最大限度地提高了搜索效率。

这项优化预计将在Elasticsearch 9.6版本中默认启用,为需要处理大规模向量数据的应用场景提供了更强大的支持。对于使用Elasticsearch进行向量搜索的开发者和企业来说,这将显著降低查询延迟,提高系统响应速度,特别是在需要实时处理大量数据的场景下(如推荐系统、图像搜索等)。

图1展示了不同向量规模下,IVF和HNSW两种结构在前置与后置过滤策略下的性能对比。可以看出,随着向量数量的增加,后置过滤的优势更加明显,特别是在大规模数据集上,性能提升可达数十倍。