OpenSearch 如何无缝支持 Elasticsearch 风格的向量检索?
你有没有遇到过这样的场景:用户搜索“轻薄本”,系统却只返回标题含“笔记本电脑”的商品,而漏掉了语义相近但用词不同的结果?或者你想基于一张图片推荐相似风格的商品,却发现传统关键词匹配完全无能为力?
这正是 向量检索 (Vector Search)大显身手的时候。
随着大模型和嵌入技术(embedding)的普及,越来越多的应用需要理解“语义相似性”而非简单的字面匹配。Elasticsearch 作为老牌搜索引擎,在 7.x 后期版本中开始实验性地引入 dense_vector 字段与 KNN 插件;而 OpenSearch ——这个从 Elasticsearch 7.10.2 分叉出来的开源项目——不仅继承了这些能力,更在稳定性、性能和生态兼容性上做了深度优化。
那么问题来了: OpenSearch 究竟是如何在底层实现对 Elasticsearch 风格向量检索的支持的?它是怎么做到既保持 API 兼容,又能高效处理高维向量搜索的?
本文将带你深入 OpenSearch 的内核机制,从数据建模、索引结构到查询执行,一步步揭开它支持向量检索的技术面纱。
为什么是 dense_vector ?它是怎么工作的?
要搞懂 OpenSearch 的向量能力,第一个绕不开的就是 dense_vector 字段类型。
这不是一个普通的数组字段,而是专为存储深度学习生成的 稠密嵌入向量 设计的数据结构。比如 BERT 输出的 [768] 维浮点数、Sentence-BERT 编码后的句向量、CLIP 提取的图像特征……它们都可以原封不动地塞进这个字段里。
创建一个带向量的索引有多简单?
只需要在 mapping 中声明:
PUT /my-index
{
"mappings": {
"properties": {
"text_embedding": {
"type": "dense_vector",
"dims": 384,
"index": true,
"similarity": "cosine"
}
}
}
}
就这么几行配置,你就拥有了一个支持向量搜索的字段。其中几个关键参数值得细看:
-
dims: 固定向量维度,最大可达 16,384。所有文档必须遵守这一长度。 -
index: true: 开启近似最近邻(ANN)索引,否则只能做脚本计算。 -
similarity: 指定默认相似度算法,如余弦、欧氏距离或点积。
写入时也毫无门槛:
POST



被折叠的 条评论
为什么被折叠?



