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.mzph.cn/news/736603.shtml

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

相关文章

学习Java的第七天

目录 一、什么是数组 二、作用 三、如何使用数组 1、声明数组变量 2、创建数组 示例&#xff1a; 3、数组的使用 示例&#xff1a; 4、数组的遍历 for循环示例&#xff08;不知道for循环的可以查看我之前发的文章&#xff09; for-each循环&#xff08;也就是增强for…

Unity基础学习

目录 基础知识点3D数学——基础Mathf三角函数坐标系 3D数学——向量向量模长和单位向量向量的加减乘除向量点乘向量叉乘向量插值运算 3D数学——四元数为何使用四元数四元数是什么四元数常用方法四元数计算 MonoBehavior中的重要内容延迟函数协同程序协同程序原理 Resources资源…

STM32CubeIDE基础学习-STM32CubeIDE软件工程文件拷贝粘贴

STM32CubeIDE基础学习-STM32CubeIDE软件工程文件拷贝粘贴 前言 在后面开发程序时&#xff0c;往往不需要再重新新建工程的了&#xff0c;可以直接在原有的工程基础上直接复制粘贴新增功能就可以了。 具体的操作方法步骤如下介绍&#xff1a; 第一步&#xff1a;找到一个原有的…

力扣中档题的简单写法:在链表中插入最大公约数

其实暴力遍历开数组也可以&#xff0c;但不如以下新建链表块的方法简单 int FindCommDivisor(int num1, int num2) {int n;int i;n fmin(num1, num2);for (i n; i > 1; i--) {if (num1 % i 0 && num2 % i 0) {return i;}}return 0; }struct ListNode *insertGr…

Mock.js 基本语法与应用笔记

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

python 导入excel空间三维坐标 生成三维曲面地形图 5-3、线条平滑曲面且可通过面观察柱体变化(三)

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata from matplotlib.c…

【SSM】整合原理和配置实战

文章目录 SSM整合是什么&#xff1f;SSM整合核心问题第一问&#xff1a;SSM整合需要几个IoC容器&#xff1f;第二问&#xff1a;每个IoC容器对应哪些类型组件&#xff1f;第三问&#xff1a;IoC容器之间关系和调用方向&#xff1f;第四问&#xff1a;具体多少配置类以及对应容器…

力扣hot100:22.括号生成(回溯)

复习一下&#xff1a; 回溯法解决的问题都可以抽象为树形结构。回溯法解决的都是在集合中递归查找子集&#xff0c;集合的大小就构成了树的宽度&#xff0c;递归的深度&#xff0c;都构成的树的深度。 对于同一层而言&#xff0c;其儿子都是等价的不同情况&#xff0c;因此当儿…

【Poe】保姆级注册教程

AI聊天机器人已成为技术界的热点。Quora推出了其全新的AI聊天机器人应用——poe&#xff0c;为用户提供了一种新的与人工智能进行互动的方式。与其他常见的AI聊天机器人不同&#xff0c;poe支持多家公司的AI系统&#xff0c;例如OpenAI的ChatGPT和Anthropic的聊天机器人。本教程…

【零基础学习01】嵌入式linux驱动中pinctrl和gpio子系统实现

大家好,为了进一步提升大家对实验的认识程度,每个控制实验将加入详细控制思路与流程,欢迎交流学习。 今天给大家分享一下,linux系统里面pinctrl和gpio子系统控制实验,操作硬件为I.MX6ULL开发板。 第一:pinctrl和gpio子系统简介 Linux系统是一个庞大又完善的系统,如果采用…

Window部署Oracle并实现公网环境远程访问本地数据库

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…

基于单片机的机动车智能远光灯系统设计

目 录 摘 要 I Abstract II 引 言 1 1 主要研究内容及总体设计方案 3 1.1 主要研究内容 3 1.2 系统总体方案选择 3 1.3 系统功能的确定 4 2 硬件电路的设计 5 2.1 单片机控制模块设计 5 2.2 液晶显示模块电路设计 7 2.3 远近灯光电路设计 9 2.4 按键电路设计 9 2.5 超声波电路…

5G与智慧文旅的融合发展:推动旅游业转型升级与可持续发展

随着5G技术的飞速发展和广泛应用&#xff0c;其与智慧文旅的融合发展正成为推动旅游业转型升级与可持续发展的重要力量。5G技术以其高速率、低时延、大连接的特性&#xff0c;为智慧文旅注入了新的活力&#xff0c;助力旅游业实现更高效、更智能、更绿色的发展。本文将深入探讨…

保持长期高效的七个法则(一)7 Rules for Staying Productive Long-Term(1)

Easily the best habit I’ve ever started was to use a productivity system.The idea is simple:organizing all the stuff you need to do (and how you’re going to do it) prevents a lot of internal struggle to get things done. 无疑&#xff0c;我曾经建立过的最好…

【初始MongoDB】MongoDB的使用(对比MySQL)

MongoDB简介 1、NoSQL简介 NoSQL(NoSQL Not Only SQL)&#xff0c;意即反SQL运动&#xff0c;指的是非关系型的数据库&#xff0c;是一项全新的数据库革命性运动&#xff0c;早期就有人提出&#xff0c;发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储…

Qt 数据库驱动未装载MYSQL

一、第一部分 0.Qt 连接mysql数据库时报错&#xff1a; QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7 QT连接代码&#xff1a; bool createMysqlConn() {QSqlDatabase sqldb QSqlDatabase::addDatabase(&qu…

如何配置固定TCP公网地址实现远程访问内网MongoDB数据库

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 前言 MongoDB是一个基于分布式文件存储的数…

JVM工作原理与实战(四十三):JVM常见面试题目

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、JVM常见面试题目 1.什么是类加载器&#xff0c;有哪些常见的类加载器&#xff1f; 2.什么是双亲委派机制&#xff0c;以及如何打破双亲委派机制&#xff1f; 3.如何判断堆上的对…

Unity性能优化篇(十) 模型优化之网格合并 Easy Mesh Combine Tool插件使用以及代码实现网格合并

把多个模型的网格合并为一个网格。可以使用自己写代码&#xff0c;使用Unity自带的CombineMeshes方法&#xff0c;也可以使用资源商店的插件&#xff0c;在资源商店搜Mesh Combine可以搜索到相关的插件&#xff0c;例如Easy Mesh Combine Tool等插件。 可大幅度减少Batches数量…

css flex 布局换行

默认使用display: flex;是不换行的&#xff0c;只需要加上flex-wrap: wrap;就行了&#xff0c;效果图 .app-center {display: flex;flex-wrap: wrap;justify-content:flex-start; } 通过上面我们发现虽然时间换行了&#xff0c;但是每行的边距不一样 加上这个就行了&#xff…