ElasticSearch的Dense Vector

ElasticSearch 7.0 新特性之 Dense Vector & Sparse Vector在ElasticSearch 8.0中已经不支持Sparse Vector。

dense_vector数据类型用来存储浮点数的密集向量,密集向量数据类型可以用在以下两种场景下:

1、用在script_score查询:为匹配筛选器的文档打分

2、用在kNN search API:查找与入参的向量 最相似的k个向量

dense_vector数据类型不支持聚合和排序

我们可以用浮点数数组来传输数据给dense_vector数据类型:

PUT my-index
{
  "mappings": {
    "properties": {
      "my_vector": {
        "type": "dense_vector",
        "dims": 3
      },
      "my_text" : {
        "type" : "keyword"
      }
    }
  }
}

PUT my-index/_doc/1
{
  "my_text" : "text1",
  "my_vector" : [0.5, 10, 6]
}

PUT my-index/_doc/2
{
  "my_text" : "text2",
  "my_vector" : [-0.5, 10, 10]
}

和其他的数据类型不同,密集向量只能存储单个值,一个dense_vector字段不能存储多个值。

索引向量支持kNN搜索

此功能处于技术预研阶段,可能在未来发布的版本中修改或者移除,大家使用的时候要注意。

kNN搜索用来查找一个向量的最近k个向量,用来做相似度评估

密集向量字段可以用于script_score查询中对文档进行排序,这使我们可以通过扫描所有文档并根据相似性对其进行排序来执行暴力的kNN搜索。

许多场景下,暴力的kNN搜索不是很有效,因此对于kNN搜索API,dense_vector类型通过索引向量为特殊的数据结构来支持快速的kNN检索。我们可以通过设置索引参数来启用索引:

PUT my-index-2
{
  "mappings": {
    "properties": {
      "my_vector": {
        "type": "dense_vector",
        "dims": 3,
        "index": true,
        "similarity": "dot_product" 
      }
    }
  }
}

当我们设置了index属性为true以后,也必须设置similarity属性才能使用kNN搜索

ES使用HNSW算法来支持更有效率的kNN搜索,和大多数kNN算法,HNSW是一种近似算法,为了提高速度而牺牲结果的准确性。

为近似kNN搜索建立向量索引是一个昂贵的过程。接收包含启用索引的向量字段的文档可能需要相当长的时间。

如果密集向量字段是在nested的映射里面,则无法被索引。

密集索引字段的参数:

字段是否必填说明
dims是,整形向量的维度大小,不能超过2048
index否,布尔设置为true,才能使用kNN搜索api,默认是false
similarity是,字符串

kNN搜索的向量相似度,文档根据与查询向量的相似度进行排序。每个文档的得分根据相似度来计算以确保分数为正,分数越高,排名越高。如果index参数为true,则此参数必填。有效的参数值如下:

l2_norm:基于欧拉距离计算相似度

dot_product:计算两个向量的点积。此选项提供了执行余弦相似性的优化方法。为了使用它,所有向量必须是单位长度,包括文档和查询向量。

cosine:计算余弦相似性。请注意,执行余弦相似性的最有效方法是将所有向量规格化为单位长度,取代使用dot_product。只有在需要保留原始向量且无法提前对其进行规格化时,才应使用余弦。余弦相似性不允许大小为零的向量,因为在这种情况下不定义余弦。尽管它们在概念上是相关的,但相似度参数不同于text字段类型相似度,并接受一组不同的选项。

index_options可选,对象

配置kNN索引算法的可选部分。HNSW算法有两个影响数据结构构建方式的内部参数,这些参数可以调整以提高结果的准确性,但代价是降低索引速度。配置index_options时,必须定义其所有属性。具体的属性如下:

type:使用哪种类型的kNN算法,当前只支持“hnsw”

m:在HNSW图中,每个节点将连接到的邻居数,默认是16

ef_construction:为每个新节点组合最近邻居列表时要跟踪的候选节点数,默认是100

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值