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 时才能指定。

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

index_options

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

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

Synthetic _source

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

dense_vector 字段支持 synthetic _source。

 

优秀的个人博客,低调大师

微信关注我们

原文链接:https://my.oschina.net/u/3343882/blog/11046745

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。