
点击蓝字关注我们
在本文中,我们将深入探讨如何在 Elasticsearch 中设置向量搜索并执行 k-NN(k-最近邻)搜索。这是 Elasticsearch 向量搜索系列的第二篇文章,旨在帮助您掌握向量搜索的核心概念及其在 Elasticsearch 中的实现方式。

背景知识

尽管 Elasticsearch 直到 8.0 版本才通过 _knn_search API 端点支持向量搜索,但从 7.0 版本开始,Elasticsearch 就已经支持使用 dense_vector 字段类型存储向量。当时,向量仅作为二进制文档值存储,并未使用任何索引算法。这些 dense_vector 字段为 Elasticsearch 后续的向量搜索功能奠定了基础。

如何设置 k-NN 搜索

在 Elasticsearch 中,向量搜索是原生支持的,无需额外安装任何组件。我们只需要创建一个索引,并定义至少一个 dense_vector 类型的字段来存储和索引向量数据。
以下是一个 dense_vector 字段的映射示例,字段名为 title_vector,维度为 3:
JSON{"mappings": {"properties": {"title_vector": {"type": "dense_vector","dims": 3,"similarity": "dot_product"}}}}
在这个示例中,dense_vector 字段将使用我们在之前文章中介绍的 dot_product 相似度函数。
精确搜索
精确搜索是一种线性搜索,也称为暴力搜索。在这种模式下,查询向量将与每个存储的向量进行比较,以找到最近的邻居。由于向量不需要在 HNSW 图中索引,因此索引时间较短,但随着数据量的增加,搜索速度会显著下降。
以下是一个使用 script_score 查询进行精确搜索的示例:
JSON{"query": {"script_score": {"query": {"range": {"price": {"gte": 100}}},"script": {"source": "cosineSimilarity(params.query_vector, 'title_vector')","params": {"query_vector": [0.1, 0.2, 0.3]}}}}}
近似 k-NN 搜索
近似 k-NN 搜索是大多数情况下推荐使用的模式,尤其是在数据量较大的场景中。虽然索引时间较长,但搜索延迟较低,能够处理数百万甚至数十亿的向量数据。
以下是一个简单的 k-NN 搜索示例:
JSON{"knn": {"field": "title_vector","query_vector": [0.1, 0.2, 0.3],"k": 2,"num_candidates": 100}}
在这个示例中,我们搜索与指定查询向量最接近的两个邻居。
过滤 k-NN 搜索
在 k-NN 搜索中,我们还可以指定过滤器来限制搜索范围。例如,以下查询仅搜索价格大于或等于 100 的文档:
JSON{"knn": {"field": "title_vector","query_vector": [0.1, 0.2, 0.3],"k": 2,"filter": {"range": {"price": {"gte": 100}}}}}
k-NN 搜索的局限性
尽管 k-NN 搜索功能强大,但仍有一些限制需要注意:
在 8.11 版本之前,k-NN 搜索无法在嵌套文档中的向量字段上运行。
search_type 始终设置为 dfs_query_then_fetch,无法动态更改。
由于 HNSW 算法的性质,返回的 k 个最近邻居并不总是真正的最近邻居。

总结

在本文中,我们详细介绍了 Elasticsearch 中的向量搜索功能。我们首先回顾了 Elasticsearch 向量搜索的背景,然后介绍了如何使用 script_score 查询进行精确搜索,以及如何使用 knn 搜索选项或 knn 查询进行近似 k-NN 搜索。
我们还探讨了如何配置 knn 搜索选项和查询,包括使用过滤器和预期相似度,以及如何同时运行多个 k-NN 搜索。最后,我们列出了 k-NN 搜索的一些局限性,并建议您查看官方文档以优化 k-NN 搜索性能。
如果您对本文内容感兴趣,请继续关注本系列的后续文章,我们将深入探讨如何结合词汇搜索和向量搜索,以及如何在 Elasticsearch 中简化语义搜索。
关于公司
感谢您关注新智锦绣科技(北京)有限公司!作为 Elastic 的 Elite 合作伙伴及 EnterpriseDB 在国内的唯一代理和服务合作伙伴,我们始终致力于技术创新和优质服务,帮助企业客户实现数据平台的高效构建与智能化管理。无论您是关注 Elastic 生态系统,还是需要 EnterpriseDB 的支持,我们都将为您提供专业的技术支持和量身定制的解决方案。
欢迎关注我们,获取更多技术资讯和数字化转型方案,共创美好未来!
![]() | ![]() |
Elastic 微信群 | EDB 微信群 |

发现“分享”和“赞”了吗,戳我看看吧






