各位技术爱好者,我是技术探索者大任,今天将带大家深入探讨Elasticsearch中的向量检索技术。
说明:本文主要基于ES 7.10版本,部分内容涉及8.17版本特性,具体实现细节请以官方文档为准
一、向量检索的基本原理
1.1 数据向量化的实现方式
当前人工智能技术通过深度学习模型,能够将非结构化数据(如文本、图片等)转换为高维数值向量(维度通常在128至1024之间)。典型应用包括:
* 文本向量化:基于BERT等预训练模型生成768维特征向量
* 视觉特征提取:使用ResNet等卷积网络获取2048维图像特征
1.2 向量检索概念解析
向量相似度检索 是一种基于数学空间计算的搜索方法。与传统的关键词匹配不同,这种方法能够更好地处理语义理解和模糊匹配需求。其核心思想是将各类数据转化为向量形式,通过计算向量间的距离或相似度来实现智能搜索。
以文本搜索为例,首先利用词嵌入技术将词语映射为向量空间中的点,然后通过聚合操作(如均值计算)得到整个文本的向量表示。搜索时,将查询内容同样转化为向量,通过相似度计算找出最相关的文档。
二、Elasticsearch向量检索实现方案
ES从7.0版本开始引入dense_vector
和sparse_vector
两种向量字段类型,其中后者在7.6版本后被弃用,8.x系列版本已不再支持该类型。
2.1 近似最近邻搜索(基于HNSW算法)
注意:7.10版本不支持此功能,以下介绍基于8.17版本
k近邻搜索通过特定相似度度量算法,找出与查询向量最接近的k个向量。
实施步骤
- 字段映射配置
必须预先定义dense_vector
字段,并确保维度与查询向量一致。向量可以通过以下方式获取: - 使用ES内置的NLP模型生成
- 通过外部API(如阿里云向量服务)获取后传入
示例映射配置:
PUT media-index
{
"mappings": {
"properties": {
"media-vector": {
"type": "dense_vector",
"dims": 3,
"index": true,
"similarity": "l2_norm"
},
"description": {
"type": "text"
}
}
}
}
支持的相似度算法包括:
– 欧式距离(l2_norm)
– 点积(dot_product)
– 余弦相似度(cosine)
– 最大内积(max_inner_product)
2. 数据导入
POST media-index/_bulk?refresh=true
{ "index": { "_id": "1" } }
{ "media-vector": [15, 30, -45], "description": "mountain landscape" }
...
- 执行搜索
POST media-index/_search
{
"knn": {
"field": "media-vector",
"query_vector": [10, 25, -40],
"k": 5,
"num_candidates": 50
}
}
- 工作机制
系统会在每个分片选取指定数量的候选向量(num_candidates),计算其与查询向量的相似度后,汇总选取全局最优的k个结果。增加候选数量可以提高准确率,但会降低查询速度。
2.2 精确全量搜索
通过计算查询向量与所有文档向量的精确距离实现100%召回,但计算开销较大。需要使用script_score
查询配合向量计算函数。
1. 映射配置(建议关闭索引以提升写入性能)
PUT goods-index
{
"mappings": {
"properties": {
"goods-vector": {
"type": "dense_vector",
"dims": 5,
"index": false
}
}
}
}
- 数据准备
POST goods-index/_bulk?refresh=true
{ "index": { "_id": "1" } }
{ "goods-vector": [120.5, 80.3, -15.2, 20.1, -90.5] }
...
- 查询示例
支持多种向量计算函数: - 余弦相似度
- 点积运算
- 各种范数计算
- 汉明距离等
POST goods-index/_search
{
"query": {
"script_score": {
"query": {"match_all": {}},
"script": {
"source": "cosineSimilarity(params.queryVec, 'goods-vector') + 1.0",
"params": {"queryVec": [115.0, 85.1, -14.9, 19.8, -88.7]}
}
}
}
}
为提高效率,建议添加过滤条件:
{
"query": {
"script_score": {
"query": {"range": {"price": {"gte": 1000}}},
"script": {...}
}
}
}
2.3 方案对比分析
实现机制
- 精确搜索:遍历计算所有向量距离
- 近似搜索:利用HNSW等索引结构快速定位
性能特点
- 响应速度:近似搜索显著占优
- 内存消耗:精确搜索更节省资源
适用场景
- 精确搜索适用场景:
- 小型法律文档库检索
- 医疗影像分析系统
- 近似搜索适用场景:
- 电商平台海量商品推荐
- 短视频实时推荐系统
三、ES其他语义搜索功能
ES通过NLP模型和向量技术提供智能语义搜索能力。semantic_text
字段类型可自动处理文本嵌入的生成和索引。
注意:此功能目前处于测试阶段
实现流程
- 创建索引
PUT smart-content
{
"mappings": {
"properties": {
"article": {
"type": "semantic_text"
}
}
}
}
- 文档索引
PUT smart-content/_doc/1
{
"article": "ES 8.17版本新增语义搜索功能"
}
- 语义查询
GET smart-content/_search
{
"query": {
"semantic": {
"field": "article",
"query": "运动后如何缓解肌肉不适"
}
}
}
典型应用场景
- 智能搜索排序优化
- 个性化推荐系统
- 多媒体内容相似检索