在基于faiss的分布式特征向量搜索系统一文中,介绍了我是如何借鉴Elasticsearch
的框架来开发分布式向量检索系统的,它在底层利用了faiss
强大的向量检索能力。从7.2
版本开始,Elasticsearch
提供了实验性的向量检索功能。
本文我们来介绍如何使用Elasticsearch
来进行向量检索。
为了存储向量,需要将字段的数据类型设置为dense_vector
,设置如下:
1 | PUT index1024 |
新建索引时设置mappings
,my_vector
字段数据类型指定为dense_vector
,维度dim
为向量的长度。注意向量维度不能超过1024
。
新建索引之后插入数据:
1 | PUT index1024/_doc/1 |
Elasticsearch
提供了cosineSimilarity
(余弦相似度)函数,使用script_score
来查询向量的相似度:
1 | { |
注:Elasticsearch
不允许分值为负,因此需要对余弦相似度加1。
Elasticsearch
向量检索的限制:
- 向量维度的限制,最大支持1024
- 向量相似度的计算在文档查询完成之后,因此如果候选的文档非常多(比如
match_all
查询,需要遍历所有的文档),计算相似度需要的时间就非常大。我做过实验,500w数据(1024维)检索需要3分钟左右。如果需要检索大量的向量使用faiss
会快的多。
https://www.elastic.co/cn/blog/text-similarity-search-with-vectors-in-elasticsearch
https://www.elastic.co/guide/en/elasticsearch/reference/7.3/query-dsl-script-score-query.html#vector-functions
https://blog.mimacom.com/elastic-cosine-similarity-word-embeddings/