Elasticsearch:dense vector 数据类型及标量量化

密集向量(dense_vector)字段类型存储数值的密集向量。 密集向量场主要用于 k 最近邻 (kNN) 搜索。

dense_vector 类型不支持聚合或排序。

默认情况下,你可以基于 element_type 添加一个 dend_vector 字段作为 float 数值数组:

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]
}

注意:与大多数其他数据类型不同,密集向量始终是单值。 不可能在一个密集向量字段中存储多个值。

kNN 搜索的索引向量

k 最近邻 (kNN) 搜索可找到与查询向量最接近的 k 个向量(通过相似性度量来衡量)。

密集向量字段可用于对 script_score 查询中的文档进行排名。 这使你可以通过扫描所有文档并按相似度对它们进行排名来执行强力(brute-force) kNN 搜索。

在许多情况下,强力 kNN 搜索效率不够高。 因此,dense_vector 类型支持将向量索引到专门的数据结构中,以支持通过 search API 中的 knn 选项进行快速 kNN 检索。

大小在 128 到 4096 之间的浮点元素的未映射数组字段动态映射为具有默认余弦相似度的密集向量。 你可以通过将字段显式映射为具有所需 similarity 的 dend_vector 来覆盖默认 similarity。

默认情况下为密集向量场启用索引。 启用索引后,你可以定义在 kNN 搜索中使用的向量 similarity:

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

注意:用于近似 kNN 搜索的索引向量是一个昂贵的过程。 提取包含启用了 index 的向量字段的文档可能需要花费大量时间。 请参阅 k 最近邻 (kNN) 搜索以了解有关内存要求的更多信息。

你可以通过将 index 参数设置为 false 来禁用索引:

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

Elasticsearch 使用 HNSW 算法来支持高效的 kNN 搜索。 与大多数 kNN 算法一样,HNSW 是一种近似方法,会牺牲结果精度以提高速度。

自动量化向量以进行 kNN 搜索

密集向量类型支持量化以减少搜索浮点向量时所需的内存占用。 目前唯一支持的量化方法是 int8,并且提供的向量 element_type 必须是 float。 要使用量化索引,你可以将索引类型设置为 int8_hnsw。

使用 int8_hnsw 索引时,每个浮点向量的维度都会量化为 1 字节整数。 这可以减少多达 75% 的内存占用,但会牺牲一定的准确性。 然而,由于存储量化向量和原始向量的开销,磁盘使用量可能会增加 25%。

PUT my-byte-quantized-index
{"mappings": {"properties": {"my_vector": {"type": "dense_vector","dims": 3,"index": true,"index_options": {"type": "int8_hnsw"}}}}
}

密集向量场的参数

接受以下映射参数:

element_type
(可选,字符串)用于对向量进行编码的数据类型。 支持的数据类型为 float(默认)和 byte。 float 对每个维度的 4 字节浮点值进行索引。 byte 索引每个维度的 1-byte 整数值。 使用 byte 可以显着减小索引大小,但代价是精度较低。 使用字节的向量需要具有 -128 到 127 之间整数值的维度,包括索引和搜索。

dims
(可选,整数)向量维数。 不能超过 4096。如果未指定 dims,它将设置为添加到该字段的第一个向量的长度。

index
(可选,布尔值)如果为 true,你可以使用 kNN 搜索 API 搜索此字段。 默认为 true。

similarity
(可选*,字符串)kNN 搜索中使用的向量相似度度量。 文档根据向量场与查询向量的相似度进行排名。 每个文档的 _score 将从相似度中得出,以确保分数为正并且分数越高对应于越高的排名。 默认为余弦。

* 该参数只有当 index 为 true 时才能指定。

有效的 similarity 值
描述
l2_norm根据向量之间的 L2 距离(也称为欧氏距离)计算相似度。 文档 _score 的计算公式为 1 / (1 + l2_norm(query, vector)^2)。
dot_product

计算两个单位向量的点积。 此选项提供了执行余弦相似度的优化方法。 约定和计算得分由 element_type 定义。

当 element_type 为 float 时,所有向量都必须是 unit 长度,包括文档向量和查询向量。 文档 _score 的计算方式为 (1 + dot_product(query, vector)) / 2。

当 element_type 为 byte 时,所有向量必须具有相同的长度,包括文档向量和查询向量,否则结果将不准确。 文档 _score 的计算公式为 0.5 + (dot_product(query, vector) / (32768 * dims)),其中 dims 是每个向量的维度数。

cosine计算余弦相似度。 请注意,执行余弦相似度的最有效方法是将所有向量标准化为单位长度,并改为使用 dot_product。 仅当需要保留原始向量且无法提前对其进行标准化时,才应使用余弦。 文档 _score 的计算方式为 (1 + cosine(query, vector)) / 2。余弦相似度不允许向量的幅值为零,因为在这种情况下未定义余弦。
max_inner_product计算两个向量的最大内积。 这与 dot_product 类似,但不需要向量标准化。 这意味着每个向量的大小都会显着影响分数。 调整文档 _score 以防止出现负值。 对于 max_inner_product 值 < 0,_score 为 1 / (1 + -1 * max_inner_product(query, vector))。 对于非负 max_inner_product 结果,_score 计算为 max_inner_product(query, vector) + 1。

 注意:尽管它们在概念上相关,但相似性参数与文本字段相似性不同,并且接受一组不同的选项。

index_options

(可选*,对象)配置 kNN 索引算法的可选部分。 HNSW 算法有两个影响数据结构构建方式的内部参数。 可以调整这些以提高结果的准确性,但代价是索引速度较慢。

* 该参数只有当 index 为 true 时才能指定。

index_options 的属性
属性描述
type(必需,字符串)要使用的 kNN 算法的类型。 可以是 hnsw 或 int8_hnsw。
m(可选,整数)HNSW 图中每个节点将连接到的邻居数量。 默认为 16。
ef_construction(可选,整数)在组装每个新节点的最近邻居列表时要跟踪的候选者数量。 默认为 100。
confidence_interval(可选,float)仅适用于 int8_hnsw 索引类型。 量化向量时使用的置信区间可以是 0.90 和 1.0 之间(包括 0.90 和 1.0)之间的任何值。 该值限制计算量化阈值时使用的值。 例如,值 0.95 在计算量化阈值时将仅使用中间 95% 的值(例如,最高和最低 2.5% 的值将被忽略)。 默认为 1/(dims + 1)。

Synthetic _source

重要:Synthetic _source 通常仅适用于 TSDB 索引(index.mode 设置为 time_series 的索引)。 对于其他索引,synthetic _source 处于技术预览阶段。 技术预览版中的功能可能会在未来版本中更改或删除。 Elastic 将努力解决任何问题,但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束。

dense_vector 字段支持 synthetic _source。

更多阅读:

  • Elasticsearch:标量量化 101 - scalar quantization 101

  • Elasticsearch:Lucene 中引入标量量化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/518714.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣爆刷第87天之hot100五连刷21-25

力扣爆刷第87天之hot100五连刷21-25 文章目录 力扣爆刷第87天之hot100五连刷21-25一、240. 搜索二维矩阵 II二、160. 相交链表三、206. 反转链表四、234. 回文链表五、141. 环形链表 一、240. 搜索二维矩阵 II 题目链接&#xff1a;https://leetcode.cn/problems/search-a-2d-…

信号处理--基于单通道脑电信号EEG的睡眠分期评估

背景 睡眠对人体健康很重要。监测人体的睡眠分期对于人体健康和医疗具有重要意义。 亮点 架构在第一层使用两个具有不同滤波器大小的 CNN 和双向 LSTM。 CNN 可以被训练来学习滤波器&#xff0c;以从原始单通道 EEG 中提取时不变特征&#xff0c;而双向 LSTM 可以被训练来将…

Unity的滑动控制相机跟随和第三人称视角三

Unity的相机跟随和第三人称视角三 第三人称相机优化介绍讲解拖动事件相机逻辑人物移动逻辑总结 第三人称相机优化 Unity第三人称相机视角一 Unity第三人称相机视角二 介绍 之前相机视角讲过了两篇文章了&#xff0c;但是都是自动旋转视角&#xff0c;今天来了新需求&#xf…

05 | 深入浅出索引(下)

在上一篇文章中&#xff0c;我和你介绍了 InnoDB 索引的数据结构模型&#xff0c;今天我们再继续聊聊跟 MySQL 索引有关的概念。 在开始这篇文章之前&#xff0c;我们先来看一下这个问题&#xff1a; 在下面这个表 T 中&#xff0c;如果我执行 select * from T where k betwe…

Java项目:40 springboot月度员工绩效考核管理系统009

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本系统的功能分为管理员和员工两个角色 管理员的功能有&#xff1a; &#xff08;1&#xff09;个人中心管理功能&#xff0c;添加管理员账号和修改…

Jmeter高效组织接口自动化用例

1、善用“逻辑控制器”中的“简单控制器”。可以把简单控制器像文件夹一样使用&#xff0c;通过它来对用例进行分类归档&#xff0c;方便后续用例的调试和执行。 2、同编写测试用例一样&#xff0c;这里的接口测试用例应该进行唯一性编号&#xff0c;这样在运行整个用例计划出现…

【ts-node】基于Typescript开发Node项目的tsconfig.json文件的配置【根据不同的Node版本配置】

第一步&#xff1a;安装对应Node版本的tsconfig.js文件 第二步&#xff1a;添加到自己的tsconfig.json: "extends": "tsconfig/node16/tsconfig.json" 最终的配置如下&#xff1a; {"extends": "tsconfig/node16/tsconfig.json",…

【CSP试题回顾】201703-2-学生排队

CSP-201703-2-学生排队 解题思路 初始化队列&#xff1a; 初始时&#xff0c;学生按照学号从小到大顺序排队&#xff0c;即学号1的学生在最前面&#xff0c;学号n的学生在最后面。使用一个向量&#xff08;vector&#xff09;myQueue来模拟这个队列&#xff0c;初始填充为1, 2…

Android Framework 通过脚本动态修改应用私有文件执行权限

你只活一次 要悦己 脚本配置 Android_source/device/sprd/***/test/test_chmod.rc service test_chmod /vendor/bin/test_chmod.shuser rootdisabledoneshoton property:sys.test_chmodtruestart test_chmodAndroid_source/device/sprd/***/test/test_chmod.sh #!/system/bin/…

第一套试卷大题

1.邻接矩阵和邻接表的写法&#xff1a; **介绍&#xff1a;**该图是一个无向图&#xff0c;所以邻接矩阵一定是对称的&#xff0c;而邻接表某节点的边数为无向图某节点的连接数 无向图的邻接矩阵&#xff1a; 无向图的邻接表&#xff08;不唯一&#xff09;&#xff1a; 根据无…

【CSP试题回顾】201703-1-分蛋糕

CSP-201703-1-分蛋糕 解题代码 #include <iostream> using namespace std;int n, k, sumCake, cake, friendNum;int main() {cin >> n >> k;for (int i 0; i < n; i){cin >> cake;sumCake cake;if (sumCake > k || i n - 1) {friendNum;sum…

2024/3/7打卡公共子序列---动态规划问题

题目&#xff1a; 给定两个长度分别为 N 和 M 的字符串 A 和 B&#xff0c;求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少。 输入格式 第一行包含两个整数 N 和 M。 第二行包含一个长度为 N 的字符串&#xff0c;表示字符串 A。 第三行包含一个长度为 M 的字符串&am…