Elasticsearch向量数据存储与搜索

1. 向量数据存储

Elasticsearch 支持向量数据类型,可以通过 dense_vector 字段类型来存储固定长度的浮点数数组,这些数组通常代表向量。这种类型的字段可以用于机器学习模型的特征向量存储。

创建带有向量字段的索引
java 复制代码
PUT /my_index
{
  "mappings": {
    "properties": {
      "my_vector": { 
        "type": "dense_vector",
        "dims": 3  // 向量的维度大小。当index为true时,不能超过1024;当index为false时,不能超过2048 。
      },
      "my_text": {
        "type": "keyword"
      }
    }
  }
}

在这个例子中,我们创建了一个名为 my_index 的索引,其中包含一个名为 my_vectordense_vector 字段,该字段用于存储 3 维的向量,还可以添加一些内容比如my_text。

向索引中添加向量数据
java 复制代码
POST /my_index/_doc/1
{
  "my_text": "一段文字描述的内容",
  "my_vector": [4.0, 3.5, 2.5]
}

这将向 my_index 索引中添加一个文档,其中包含一个向量和一些文本。

2. 向量数据搜索

Elasticsearch 允许使用向量字段执行余弦相似度、欧氏距离或点积等相似度度量的搜索查询。

使用脚本查询进行向量相似度搜索

java 复制代码
GET /my_index/_search
{
  "query": {
    "script_score": {
      "query": {"match_all": {}},
      "script": {
        "source": "cosineSimilarity(params.query_vector, 'my_vector') + 1.0",
        "params": {
          "query_vector": [4, 3.5, 2.5]
        }
      }
    }
  }
}

在此查询中,我们使用了 script_score 查询以计算每个文档的 my_vector 字段与查询向量之间的余弦相似度。+1.0 是为了确保脚本返回的分数是非负的,因为余弦相似度的范围是 -1, 1

注意:向量字段下index参数设置false或不要指定,可提高检索效率

使用K NN查询进行向量相似度搜索

注意:创建近似KNN时(近似KNN搜索是在8.0版本新增的),索引mapping必须设置index为true,并指定similarity参数值,Mapping如下

java 复制代码
{
  "mappings": {
    "properties": {
      "file-vector": {
        "type": "dense_vector",//用来存储浮点数的密集向量。需要设置为dense_vector。
        "dims": 3,//向量的维度大小。当index为true时,不能超过1024;当index为false时,不能超过2048 。
        "index": true,//是否为kNN生成新的索引。实现近似kNN查询时,需要将index设置为true,默认为false。
        "similarity": "l2_norm"//文档间的相似度算法。index为true时,此值必须设置,可以是 l2_norm 、dot_product、cosine 其中之一
      },
      "title": {
        "type": "text"
      },
      "name": {
        "type": "keyword"
      }
    }
  }
}

检索

java 复制代码
{
  "knn": {
    "field": "file-vector",
    "query_vector": [-5, 9, -12],
    "k": 10,
    "num_candidates": 100
  },
  "fields": [ "title", "name" ]
}
参数 是否必选 说明
field 要搜索的向量字段名称。必须是向量字段
query_vector 查询向量,必须与field指定的向量数据具有相同的维度。
k 返回的最近邻对象的数量。该值必须小于 num_candidates
num_candidates 每个分片上需查找的最近邻候选对象的个数,不能超过10000。 Elasticsearch 从每个分片收集 num_candidates 个结果,然后将它们合并以查找前 k 个结果。 说明 增加 num_candidates 往往会提高最终 k 结果的准确性,但相应搜索速度会变慢
filter 通过DSL语句过滤文档。kNN从过滤后的文档中返回前K个文档,如果不指定过滤器,将对所有文档做kNN近似计算。

更详细的可以看这里

使用脚本查询Vs使用K NN查询

K NN查询:

近似kNN以较慢的索引速度和较低的准确性为代价来降低延迟,但无法与 Query DSL 一起使用,即无法进行混合搜索。。

适用于大规模数据集: KNN搜索对大规模数据集进行相似性搜索时具有较好的性能。

脚本查询:

这种搜索方式是先执行 query ,然后对匹配的文档再进行向量相似度算分,其隐含的含义是:

  • 向量字段可以与其它字段类型一起使用,也就是支持混合查询(先进行全文搜索,再基于搜索结果进行向量搜索)。
  • script_score 是一种暴力计算,数据集越大,性能损耗就越大。

总结

Elasticsearch的KNN搜索提供了一种高效的方法来找到最相似的文档,搜索速度非常快,但可能会受到资源消耗影响。而"script_score"查询则提供了更大的灵活性和复杂度控制且精确度高,但可能会带来性能开销和可维护性的问题。选择哪种方法取决于特定的用例、性能要求和技术能力。

相关推荐
大大大大晴天️8 分钟前
每天认识一个组件:统一 Shuffle 引擎Apache Uniffle
大数据·uniffle
事界见闻21 分钟前
汽车备件自动化立体仓库该如何规划?借鉴丰田 45000 个 SKU 项目实践
大数据·自动化·汽车
BYSJMG3 小时前
计算机毕设选题做什么好?基于大数据的用户健身行为数据分析与可视化系统,Hadoop+Spark处理
大数据·人工智能·hadoop·数据分析·spark·课程设计
知见漫记7 小时前
AI 桌面 Agent 本地执行能力技术对照:沙箱机制与权限模式拆解
大数据·人工智能
xcl09259 小时前
幼儿托育系统开发实战:从需求分析到上线全流程指南
java·大数据·需求分析
cspttty9 小时前
国际经济与贸易专业考什么证对就业有帮助
大数据
足球魅力9 小时前
哪款足球软件能分析凯利指数大数据?
大数据·业界资讯
LaughingZhu10 小时前
Product Hunt 每日热榜 | 2026-09-05
人工智能·深度学习·神经网络·搜索引擎·百度
xwz小王子10 小时前
机器人的“最后一毫米”: 新加坡南洋理工大学Facet-0如何教会基础模型“感受”自己的动作?
大数据·人工智能·机器人
腾视科技-AI10 小时前
腾视科技AIBOX双版本重磅发布!本地安全与全球适配,解锁视频智能新可能
大数据·人工智能·科技·安全·大模型·腾视科技·ai算力盒