ES 原生向量检索

这篇文章介绍了 ES 原生支持向量检索的方式。后面再出一篇,如何采用ES插件的方式集成其它向量检索工具,比如:ES+FAISS

KNN(k-nearest neighbor) search vs ANN search
KNN 检索:给定一个 query vector,寻找 K个与之最相近的向量。数据量太时,KNN检索性能太差,实际应用中一般采用ANN检索。

向量检索的步骤

  1. 将待检索的数据转换成向量表示,比如将“有商品曝光的 query” 通过 transformer 转换成 query embing 向量,其表现形式则是:128维的 float 数组。
  2. 将 float 数组 indexing 到 ES 的 dense_vector 类型的字段中。
  3. 基于 ES 提供的2种向量检索方式,进行搜索。这2种方式分别是:近似KNN搜索的ANN搜索,以及:精确的暴力KNN搜索(基于 script_score 查询实现)

向量检索中的距离

如何衡量2个向量相似?引入了:向量之间的距离。常用的计算距离函数有3种:

  1. l2 norm,欧式距离
  2. dot-product,向量的点积
  3. cosine,余弦相似度

两种向量检索方式

暴力 KNN 检索
采用 ES 的 script_score 查询实现,在script中指定计算距离的函数。
近似的 KNN 检索(ANN)
与暴力检索相比,我们可以采用某种算法,牺牲一些精度,来加速查找与 query vector 相似的向量。这种加速查找的算法最常用的如下:

  1. 基于:倒排+聚类的方式 IVF
  2. 基于:图的方式,HNSW
  3. 基于LSH(局部敏感hash)
  4. 基于树结构 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" ]
}

涉及的参数有:

  1. num_candidates,在ES的每个分片上执行向量检索,找到与 query-vector 最相近的:num_candidates 个向量返回
  2. k,对每个分片上的 num_candidates 个向量进行合并,合并成全局的 top k 个向量,返回给 client。
  3. query_vector,用户输入的向量,从:byte-image-vector 中找到:与 query-vecotr 最相近的 k 个向量返回。
  4. 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

posted @   大熊猫同学  阅读(1519)  评论(4编辑  收藏  举报
相关博文:
阅读排行:
· Blazor Hybrid适配到HarmonyOS系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
点击右上角即可分享
微信分享提示