内容提要
Elasticsearch 8.0 推出基于 Lucene HNSW 算法的近似最近邻(ANN)搜索,以 _knn_search 终端技术预览发布,支持高维向量高效检索,速度比精确 kNN 全扫描快几个数量级,召回率约 95%,未来将支持过滤和混合搜索。
延伸解读
ANN 搜索的精度与速度权衡
Elasticsearch 8.0 的 ANN 搜索基于 HNSW 算法,通过牺牲少量精度来大幅提升速度。在 100 万个 128 维向量的测试中,_knn_search 的召回率约为 95%,而精确搜索的召回率为 100%。这意味着 ANN 平均能在 10 个真实最近邻中找到超过 9 个,但可能遗漏个别结果。对于大多数应用,这种精度损失可以接受,但若场景要求绝对准确,则需谨慎评估。
技术预览阶段的注意事项
ANN 搜索的 _knn_search 终端在 8.0 中作为技术预览发布,尚未正式 GA。这意味着 API 可能发生变化,且功能尚不完整,例如暂不支持过滤和混合搜索。不过,底层的 dense_vector 字段类型自 7.6 起已正式发布,API 稳定。在生产环境使用前,建议关注官方更新,并准备好应对可能的接口调整。
参数调优与召回率测量
ANN 搜索包含索引时和搜索时参数,用于平衡搜索延迟、结果准确性和索引成本。例如,num_candidates 参数控制搜索时考虑的候选数量,影响召回率和速度。文章强调,测量数据集上的召回率至关重要,以确保配置运行良好。用户应参考官方指南进行调优,并利用 Elasticsearch 夜间基准测试(基于 es-rally)来评估性能。
基于 Lucene 的深度集成优势
Elasticsearch 的 ANN 搜索构建在 Apache Lucene 的新向量搜索功能之上,这带来了与现有功能的深度集成。例如,Lucene 实现能透明处理已删除文档(通过跳过“墓碑”),并遵循数据兼容性保证,确保向量数据在升级后仍可用。此外,Java 实现简化了安全性和内存管理。这种集成是依赖外部 ANN 库难以实现的。
Q&A
Elasticsearch 8.0 的近似最近邻(ANN)搜索是什么?
Elasticsearch 8.0 推出了基于 Lucene HNSW 算法的近似最近邻(ANN)搜索,以 _knn_search 终端技术预览形式发布,支持高维向量高效检索,速度比精确 kNN 全扫描快几个数量级,召回率约 95%。
为什么需要近似最近邻搜索而不是精确 kNN?
现代文本和图像嵌入模型生成的高维向量(100-1000 维)使得精确 kNN 全扫描效率低下。ANN 算法通过牺牲少量准确性来大幅提高速度,能在大型数据集上高效运行,而精确搜索虽然召回率 100% 但速度慢几个数量级。
Elasticsearch 8.0 的 ANN 搜索使用什么算法?为什么选择它?
Elasticsearch 8.0 使用分层可导航小世界图表(HNSW)算法,该算法根据向量相似性组织成图表。选择原因包括:在 ann-benchmarks 数据集中表现强大、工业界广泛使用、已在多个系统中实现,且设计灵活允许未来整合不同方法。
如何在 Elasticsearch 中使用 _knn_search 进行向量搜索?
首先在索引映射中设置 dense_vector 字段,指定 dims、index: true 和 similarity 指标(如 l2_norm)。然后索引向量数据。搜索时使用 GET index/_knn_search,指定 knn 参数:field、query_vector、k 和 num_candidates。
Elasticsearch ANN 搜索的性能如何?
在 100 万个 128 维图像向量的测试中,_knn_search 达到 849.286 QPS,召回率 0.945(k=10),而精确 script_score 仅 5.257 QPS,召回率 1.000。ANN 搜索速度快几个数量级,召回率约 95%,平均能在 10 个真正最近邻中找到超过 9 个。
Elasticsearch ANN 搜索的未来计划是什么?
未来计划包括:支持带筛选器的 ANN 搜索、将 ANN 结果与传统查询结果结合的混合搜索、提高索引速度(构建 HNSW 图表耗时),并最终将 ANN 集成到 _search API 中。目前 _knn_search 为技术预览,dense_vector 字段类型自 7.6 起已正式发布。