1. Elasticsearch向量相似度算法概述
在信息检索领域,向量相似度计算已经成为现代搜索系统的核心技术。Elasticsearch作为领先的开源搜索引擎,从7.x版本开始逐步引入向量搜索功能,使得传统全文检索与向量搜索能够有机结合。这种混合检索方式特别适合处理非结构化数据(如图片、音频、长文本段落)的相似性匹配需求。
我首次在实际项目中应用Elasticsearch向量搜索是在一个电商推荐系统场景。当时我们需要解决"根据用户浏览商品图片找相似款"的需求,传统的关键词匹配完全无法满足精度要求。通过将商品图片特征向量化后存入Elasticsearch,配合余弦相似度算法,最终将推荐准确率提升了37%。这个实战案例让我深刻认识到向量搜索的价值。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心相似度算法解析
2.1 余弦相似度(Cosine Similarity)
这是Elasticsearch默认采用的向量相似度算法,计算公式为:
code复制similarity = (A·B) / (||A|| * ||B||)
其中A·B表示向量点积,||A||表示向量的L2范数。该算法通过计算两个向量间夹角的余弦值来衡量相似度,取值范围[-1,1],值越大表示越相似。
实际应用中发现,当向量经过归一化处理后(即||A||=1),计算可以简化为纯点积运算,性能提升显著。这在处理高并发查询时尤为重要。
2.2 欧氏距离(Euclidean Distance)
计算公式为:
code复制distance = √Σ(Ai - Bi)²
虽然名为"距离",但可以通过简单转换(1/(1+distance))得到相似度分数。在Elasticsearch中需要通过script_score方式实现:
json复制{
"script_score": {
"script": {
"source": "1 / (1 + l2norm(params.queryVector, doc['vector_field']))",
"params": {
"queryVector": [0.12, 0.24, ...]
}
}
}
}
2.3 点积相似度(Dot Product)
纯向量点积计算:
code复制similarity = Σ(Ai * Bi)
在Elasticsearch 8.0+中可以直接指定:
json复制{
"similarity": "dot_product"
}
注意点积对向量长度敏感,通常需要先进行归一化处理。我在处理用户画像匹配时,未归一化的向量导致长文本特征完全主导了匹配结果,经过一周排查才发现这个问题。
3. Elasticsearch向量实现详解
3.1 向量字段映射配置
Elasticsearch支持两种向量存储方式:
- dense_vector:常规稠密向量
json复制
