向量检索引擎选型

前言

本文对比ElasticSearch和Vearch这两个数据库作为向量检索引擎的性能等指标。

ElasticSearch

目前ES7和ES8都支持向量字段类型,但是ES8支持了KNN Search,有更好的检索性能。

KNN Search支持多种相似性计算方法:www.elastic.co/guide/en/el...

KNN Search使用文档参考:www.elastic.co/guide/en/el...

ES7+ElasticKNN插件

因为ES7本身仅支持了存储向量数据类型,但是对检索并没有做优化,检索采用暴力检索的方式,性能非常差。通过安装加速插件ElasticKNN来优化检索性能。

我本地使用Docker部署了ElasticSearch,安装过程如下:

bash 复制代码
# 本地使用colima来启动docker
# es对于内存有要求,本地测试8G可以正常启动,但是4G回启动失败
colima start --cpu 4 --memory 8

# 进入colima虚拟机
colima ssh
# 在colima虚拟机上运行
sudo sysctl -w vm.max_map_count=262144

# 退出colima虚拟机,在本机运行
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.16

docker network create elastic

docker run --name es01 --net elastic -p 9200:9200 -it -m 8GB -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.17.16

# 进入container内部,安装plugin
./elasticsearch-plugin install file:////root/download/elastiknn-7.17.3.0.zip

mapping创建:

json 复制代码
{
    "settings": {
        "index": {
            "number_of_shards": 1,
            "number_of_replicas": 1,
            "elastiknn": true
        }
    },
    "mappings": {
        "properties": {
            "driver": {
                "properties": {
                    "id": {
                        "type": "keyword"
                    },
                    "age": {
                        "type": "short"
                    }
                }
            },
            "img_vector": {
                "type": "elastiknn_dense_float_vector",
                "elastiknn": {
                    "dims": 512,
                    "model": "lsh",
                    "similarity": "cosine",
                    "L": 99,
                    "k": 1
                }
            }
        }
    }
}

ES8

也是用docker来搭建ES,安装过程类似于ES7。

mapping如下:

json 复制代码
{
    "settings": {
        "index": {
            "number_of_shards": 1,
            "number_of_replicas": 1
        }
    },
    "mappings": {
        "properties": {
            "driver": {
                "properties": {
                    "id": {
                        "type": "keyword"
                    },
                    "age": {
                        "type": "short"
                    }
                }
            },
            "img_vector": {
                "type": "dense_vector",
                "dims": 512,
                "similarity": "dot_product",
				"index_options": {
					"type": "hnsw",
					"m": 40,
					"ef_construction": 400
				}
            }
        }
    }
}

ES检索效率测试

  1. 本地搭建单节点ES集群,版本为7.17.3/8.11.0
  2. 测试的时候,对比原生的ES向量检索以及通过安装加速插件ElasticKNN的向量检索两者的效率。
  3. 测试的数据是通过本地随机生成,数据结构如下,其中向量的维数为512
测试项目 doc数量 index存储占用空间 查询效率(10次查询取平均)
V7.17.3+单shard+TOP5 100w 2.7GB 8.7s
V7.17.3+3 shards+TOP5 100w 2.7GB 2.7s
V7.17.3+ElasticKNN+单shard+TOP5 100w 3.3GB 400ms
V7.17.3+ElasticKNN+单shard+TOP100 100w 3.3GB 700ms
V7.17.3+ElasticKNN+单shard+TOP100 200w 6.8GB 1.3s
V8.11.0+单shard+TOP100 50w 1.2GB 60ms
V8.11.0+单shard+TOP100(M=40, ef_construction=400, num_candidates=100) 50w 1.2GB 100ms
V8.11.0+单shard+TOP100(M=40, ef_construction=400, num_candidates=200) 50w 1.2GB 200ms

ES召回率测试

版本:V8.11.0

参数:

  1. 建索引时:

    M: 40

    ef_construction: 400

  2. 搜索时:

    k:100

    num_candidates:200

项目 平均查询耗时 召回率
Top10 18ms 0.994709
Top100 19ms 0.994709

Vearch

Vearch 是一个分布式向量搜索系统,可用来存储、计算海量的特征向量,为 AI 领域的向量检索提供基础系统支撑与保障。该系统能够广泛地应用于图像, 音视频和自然语言处理等各个机器学习领域。

Vearch支持的特性:

  1. 高可用,高可靠,数据持久化存储。
  2. 支持RESTful API
  3. 支持多种ANNS(近似最近邻搜索)索引,满足不同场景需求。

Vearch在创建表空间的时候,需要配置索引构建的相关参数,在搜索的时候,针对不同的索引类型有不同的参数配置,这些参数会影响检索的性能、召回率和精度。参数的配置技巧可以参考:

github.com/vearch/vear...

Vearch检索效率测试

测试的数据是通过本地随机生成,数据结构如下,其中向量的维数为512。

测试项目 doc数量 查询效率(10次查询取平均)
单partition+Top100 100w 80ms

ElasticSearch VS Vearch

检索引擎 是否支持全量数据更新 检索性能 使用难度(参数复杂程度) 稳定性
ElasticSearch
Vearch
相关推荐
excel9 分钟前
使用 Prisma 实现数据库字段的动态迁移实践
前端·后端
转转技术团队11 分钟前
边学边做:图片识别技术的学习与应用
后端·算法
程序员爱钓鱼13 分钟前
Go语言项目工程化 —— 日志、配置、错误处理规范
后端·google·go
天天摸鱼的java工程师15 分钟前
假设你在开发订单系统时遇到高并发下库存扣减出错,如何解决?由浅入深分析
java·后端·面试
没逻辑15 分钟前
Go 服务架构性能优化指南(实战精选)
后端·性能优化·go
奕川18 分钟前
Spring AI 实战指南:模型集成与调优
后端·aigc
春野蓝18 分钟前
基于Maven Archetype创建项目脚手架
后端
前端拿破轮22 分钟前
不是吧不是吧,leetcode第一题我就做不出来?😭😭😭
后端·算法·leetcode
一块plus25 分钟前
什么是去中心化 AI?区块链驱动智能的初学者指南
人工智能·后端·算法
肖笙XiaoSheng27 分钟前
使用Gemini2.5 pro 优化我的定时任务(二)
java·后端·代码规范