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

这篇具有很好参考价值的文章主要介绍了Elasticsearch:dense vector 数据类型及标量量化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

dense vector,Elasticsearch,AI,Elastic,elasticsearch,大数据,搜索引擎,人工智能,数据库,全文检索

密集向量(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。

dense vector,Elasticsearch,AI,Elastic,elasticsearch,大数据,搜索引擎,人工智能,数据库,全文检索

使用 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)。

dense vector,Elasticsearch,AI,Elastic,elasticsearch,大数据,搜索引擎,人工智能,数据库,全文检索

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 中引入标量量化文章来源地址https://www.toymoban.com/news/detail-842630.html

到了这里,关于Elasticsearch:dense vector 数据类型及标量量化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 张量(Tensor)、标量(scalar)、向量(vector)、矩阵(matrix)

    张量(Tensor)、标量(scalar)、向量(vector)、矩阵(matrix) Python Numpy 切片和索引(高级索引、布尔索引、花式索引) Python NumPy 广播(Broadcast) 张量(Tensor) :Tensor = multi-dimensional array of numbers 张量是一个多维数组,它是标量,向量,矩阵的高维扩展 ,是一个数据容器,张

    2024年02月03日
    浏览(39)
  • Elastic 发布 Elasticsearch Relevance Engine™ — 为 AI 革命提供高级搜索能力

    作者:Matt Riley 今天我们将向大家介绍 Elasticsearch Relevance Engine™(ESRE™) ,这是一种创建高度相关的 AI 搜索应用程序的新功能。ESRE 建立在 Elastic 在搜索领域的领导地位以及超过两年的机器学习研究和开发基础之上。Elasticsearch Relevance Engine 结合了 AI 的最佳实践和 Elastic 的文

    2024年02月06日
    浏览(40)
  • ChatGPT 和 Elasticsearch:使用 Elastic 数据创建自定义 GPT

    作者:Sandra Gonzales ChatGPT Plus 订阅者现在有机会创建他们自己的定制版 ChatGPT,称为 GPT,这替代了之前博客文章中讨论的插件。基于本系列的第一部分的基础 —— 我们深入探讨了在 Elastic Cloud 中设置 Elasticsearch 数据和创建向量嵌入 —— 这篇博客将指导你完成开发一个定制的

    2024年04月26日
    浏览(38)
  • ChatGPT 和 Elasticsearch:使用 ChatGPT 处理 Elastic 数据的插件

    作者:Baha Azarmi 你可能已经阅读过这篇关于我们将 Elasticsearch 的相关性功能与 OpenAI 问答功能相结合的博文。 该帖子的主要思想是说明如何将 Elastic 与 OpenAI 的 GPT 模型结合使用来构建响应并向用户返回上下文相关的内容。 我们构建的应用程序可以公开一个搜索端点并被任何

    2024年02月06日
    浏览(44)
  • Elasticsearch:如何通过 3 个简单步骤从 Elastic 数据中删除个人身份信息

    作者:Peter Titov 对于任何组织来说,个人身份信息 (Personally Identifiable information, PII) 合规性都是一个日益严峻的挑战。 无论你是在电子商务、银行、医疗保健还是其他数据敏感的领域,PII 都可能会在无意中被捕获和存储。 拥有结构化日志,可以轻松快速识别、删除和保护敏

    2024年02月13日
    浏览(50)
  • 【C++ STL容器】:vector存放数据以及存放自定义的数据类型

    时不可以苟遇,道不可以虚行。 STL 中最常用的容器为: vector ,暂且把它理解为我们之前学过的数组 Array 。 添加头文件: #include vector 利用内置函数: push_back() 先声明两个迭代器, 一个指向容器中的第一元素 , 一个指向容器中的最后一个元素的下一个位置 然后利用一层

    2024年02月15日
    浏览(55)
  • Observability:如何把 Elastic Agent 采集的数据输入到 Logstash 并最终写入到 Elasticsearch

    在之前的文章 “安装独立的 Elastic Agents 并采集数据 - Elastic Stack 8.0”,我们详述了如何使用 No Fleet Server 来把数据写入到 Elasticsearch 中。在今天的文章中,我们来详述如下使用 Elastic Agents 在独立(standalone)模式下来采集数据并把数据最终通过 Logstash 来写入到 Elasticsearch 中去

    2024年02月11日
    浏览(53)
  • Matlab高效编程:向量化(vectorization)、矩阵化、变量预定义

    目录 0. 前言 1. 变量预定义 2. 向量化,vectorization 3. 矩阵化 3.1 离散化 3.2 双重循环实现 3.3 向量化实现 3.4 矩阵化实现         本文介绍几个Matlab常用的提高运行效率的编程技巧。         对一个基于数值化的方式计算一个连续函数的频谱(傅里叶变换)的例子给出了三种实

    2024年02月02日
    浏览(52)
  • ETF场内基金:AI量化投资最佳切入点(数据篇)

    原创文章第77篇,专注“个人成长与财富自由、世界运作的逻辑, AI量化投资”。 关于量化的基础知识,前面说得差不多了。 后面要开始实战。 量化的细分市场很多,如下图所示: 再从风险收益来看,从基金到加密货币,从“保守”到“激进”。 这里指的保守,当然是“主

    2024年01月21日
    浏览(55)
  • ES修改字段类型(elastic)

    有个需求是将es的一个date类型的字段改为string类型,经查阅资料发现es不支持直接修改字段类型,只能将原索引结构复制出来,然后单独修改某个字段的类型后,再去新建一个索引将这个结构填充进去,填充完复制原索引数据到新索引,进而使用新的索引(也可以删掉老的索

    2024年02月06日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包