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"查询则提供了更大的灵活性和复杂度控制且精确度高,但可能会带来性能开销和可维护性的问题。选择哪种方法取决于特定的用例、性能要求和技术能力。

相关推荐
科技小E1 分钟前
视频设备轨迹回放平台EasyCVR打造水库大坝智慧安防视频监控智能分析方案
大数据·网络·人工智能·音视频·安防监控
zxsz_com_cn32 分钟前
医疗设备预测性维护的合规性挑战与标准化路径研究
大数据·数据库·人工智能
Java程序之猿1 小时前
Spring Boot 集成spring-boot-starter-data-elasticsearch
spring boot·elasticsearch·jenkins
PcVue China2 小时前
PcVue助力立讯:精密制造的智能化管控实践!
大数据·人工智能·制造
Data-Miner2 小时前
158页PPT | 某大型研发制造集团信息化IT规划整体方案
大数据·制造
Elasticsearch2 小时前
如何增加 Elasticsearch 中的 primary shard 数量
elasticsearch
阿里云大数据AI技术2 小时前
阿里云 Elasticsearch Serverless 检索增强型 8.17 版来袭!
大数据·elasticsearch·serverless
反向跟单策略2 小时前
期货跟单软件云端部署的重要性
大数据·数据分析·区块链
卓豪终端管理2 小时前
如何安全地管理固定功能设备?
java·大数据·开发语言·网络·人工智能·安全
chat2tomorrow3 小时前
如何构建类似云数据仓库 Snowflake 的本地数据仓库?
大数据·数据仓库·低代码·数据治理·snowflake·sql2api