ES 原生向量检索
这篇文章介绍了 ES 原生支持向量检索的方式。后面再出一篇,如何采用ES插件的方式集成其它向量检索工具,比如:ES+FAISS
KNN(k-nearest neighbor) search vs ANN search
KNN 检索:给定一个 query vector,寻找 K个与之最相近的向量。数据量太时,KNN检索性能太差,实际应用中一般采用ANN检索。
向量检索的步骤
- 将待检索的数据转换成向量表示,比如将“有商品曝光的 query” 通过 transformer 转换成 query embing 向量,其表现形式则是:128维的 float 数组。
- 将 float 数组 indexing 到 ES 的 dense_vector 类型的字段中。
- 基于 ES 提供的2种向量检索方式,进行搜索。这2种方式分别是:近似KNN搜索的ANN搜索,以及:精确的暴力KNN搜索(基于 script_score 查询实现)
向量检索中的距离
如何衡量2个向量相似?引入了:向量之间的距离。常用的计算距离函数有3种:
- l2 norm,欧式距离
- dot-product,向量的点积
- cosine,余弦相似度
两种向量检索方式
暴力 KNN 检索
采用 ES 的 script_score 查询实现,在script中指定计算距离的函数。
近似的 KNN 检索(ANN)
与暴力检索相比,我们可以采用某种算法,牺牲一些精度,来加速查找与 query vector 相似的向量。这种加速查找的算法最常用的如下:
- 基于:倒排+聚类的方式 IVF
- 基于:图的方式,HNSW
- 基于LSH(局部敏感hash)
- 基于树结构 KD-tree
其中,ES 的 ANN 检索采用:HNSW 算法实现。向量检索工具包 faiss 则将上述各种算法都实现了。
ES ANN 检索
将待查询的字段放在“knn” option 里面,发起查询,示例如下:
POST byte-image-index/_search
{
"knn": {
"field": "byte-image-vector",
"query_vector": [-5, 9],
"k": 10,
"num_candidates": 100
},
"fields": [ "title" ]
}
涉及的参数有:
- num_candidates,在ES的每个分片上执行向量检索,找到与 query-vector 最相近的:num_candidates 个向量返回
- k,对每个分片上的 num_candidates 个向量进行合并,合并成全局的 top k 个向量,返回给 client。
- query_vector,用户输入的向量,从:byte-image-vector 中找到:与 query-vecotr 最相近的 k 个向量返回。
- field,字段名称,byte-image-vector 字段存储了:float 数组,对该字段进行向量检索。
向量检索字段 与 其它字段 「混合」查询
方式一:
因为 filter 语句是放在 knn option 里面,在执行 knn 查询的同时,执行 filter 查询,确保能返回 5个(k=5) doc。这并不是:后置过滤。所谓后置过滤就是:基于knn查询的结果之上,再对 文件类型为png 的 doc 做过滤,后置过滤可能会导致:最终返回的 doc 不足5个。Pre-filter KNN vector search
POST image-index/_search
{
"knn": {
"field": "image-vector",
"query_vector": [54, 10, -2],
"k": 5,
"num_candidates": 50,
"filter": {
"term": {
"file-type": "png"
}
}
},
"fields": ["title"],
"_source": false
}
方式二:
knn 检索有一个打分,match query 检索有一个打分。根据公式计算出打分最高的 top 10 个(size=10) doc 返回。
score = 0.9 * match_score + 0.1 * knn_score
查询语句如下:
POST image-index/_search
{
"query": {
"match": {
"title": {
"query": "mountain lake",
"boost": 0.9
}
}
},
"knn": {
"field": "image-vector",
"query_vector": [54, 10, -2],
"k": 5,
"num_candidates": 50,
"boost": 0.1
},
"size": 10
}
参考:
1.https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html#knn-search
2. https://www.elastic.co/guide/en/elasticsearch/reference/current/dense-vector.html#dense-vector
3. Vector search is integrated in Elasticsearch through Apache Lucene
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Blazor Hybrid适配到HarmonyOS系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库