ES 近一年新版本,关于knn的新功能与优化

2024-08-27 14:36
文章标签 es 优化 功能 版本 knn 一年

本文主要是介绍ES 近一年新版本,关于knn的新功能与优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

近一年,es发布了很多个版本。本文,主要整理了es关于knn搜索相关的优化项。

也放了官方文档的链接。

8.8 版本

What’s new in 8.8 | Elasticsearch Guide [8.8] | Elastic

Reciprocal Rank Fusion (RRF)

改添加了倒数排名融合 (RRF),它遵循将结果集合并在一起的基本公式,sum(1/(k+d))其中k 是排名常量,d是文档在查询结果集中的得分位置。以这种方式排名的主要优势是结果集的分数不必相对于彼此进行规范化,因为 RRF 仅依赖于每个结果集中的位置。

PRF是用来更好的融合KNN和BM25相关性分数的方法。有了这个以后,才是真正意义上的支持混合检索。将BM25的相关性和KNN的相关性结合。

遗憾的是,这是一个白金版本,也就是只有氪金才能使用。es的官方授权是非常贵的,它是按照节点来售卖的,大概每个节点每年10w。

{
  "query": {
    "match": {
      "product": {
        "query": "brown shoes"
      }
    }
  },
  "knn": {
    "field": "product-vector",
    "query_vector": [54, 10, -2],
    "k": 20,
    "num_candidates": 75
  },
  "rank": {
     "rrf": {
        "window_size": 100,
        "rank_constant": 20
     }
  }
}

knn检索,支持相似度阈值参数similarity

这添加了一个新参数,knn允许过滤超出给定相似度的最近邻结果。

num_candidates并且k仍然是必需的,因为这控制着最近邻向量搜索的准确性和探索。对于每个分片,查询将搜索num_candidates并仅保留在提供的similarity边界内的分片,然后最终k像往常一样减少到全局顶部。

例如,当使用l2_norm索引相似度值时,这可以被视为radius对的后过滤knn。

官方发布(ELSER) 模型,并能够在es中天然使用

ELSER是非常有用,特别是在英文场景下。找回的相关性排名要远比Bm25好。

不过遗憾的是,这需要用到ML的功能模块。此模块也是白金版功能,同样需要氪金才能使用。如果作为体验,可以试用一个月,来试试效果。

8.9 版本

What’s new in 8.9 | Elasticsearch Guide [8.9] | Elastic

KNN检索,支持embedding

从 8.9 开始,text_embedding query_vector_builderkNN 搜索扩展已普遍可用。此功能是通过将文本转换为密集向量来执行Semantic search | Elasticsearch Guide [8.9] | Elastic

该功能主要是支持,将embedding模型放在es集群中跑,然后仅仅通过传参数的方式,选择对我们的query进行embedding。可能会很方便。不过向集群导入模型,也是白金版功能。

8.10 版本

What’s new in 8.10 | Elasticsearch Guide [8.10] | Elastic

启用跨段并行 KNN 搜索

Elasticsearch 过去一直按顺序跨段执行搜索。Lucene 支持在收集命中(通过收集器管理器)以及重写某些查询(例如 knn 查询)时跨段并行搜索。

此提交还允许在 DFS 阶段执行并发搜索,这将提高资源使用率以及受益于并发重写和收集的 knn 查询的性能。

技术细节

Elasticsearch 现已准备好支持单个分片内的并发性。搜索已使用收集器管理器执行,最后一个缺失的部分是为索引搜索器提供一个执行器,以便它可以将并发计算卸载到它。

此提交引入了辅助执行器,专门用于执行搜索的并发部分。搜索线程仍然是协调搜索的线程(调用者搜索将从中发起),但实际工作将转移给新引入的执行器。

我们不仅卸载了并行执行,还卸载了顺序执行,以使工作负载更加可预测,因为在两个线程池中执行搜索部分会让人感到惊讶。此外,这可能会导致突然运行大量繁重操作(一些在调用者线程中,一些在单独的线程中),这可能会使系统过载,并使线程池的大小调整更加困难。

请注意,提取操作以及其他操作仍在搜索线程池中执行。此提交不会使搜索线程池成为仅用于协调的线程池,它只针对与 IndexSearcher#search 操作本身有关的操作,尽管这占搜索 API 执行不同阶段的很大一部分。

鉴于搜索器会阻塞以等待所有任务完成,我们采取了一种简单的方法,即引入一个线程池执行器,该执行器的大小与现有搜索线程池相同,但依赖于无界队列。这简化了线程池队列和拒绝的处理。事实上,我们希望保证辅助线程池不会拒绝,并将排队完全委托给搜索线程池,无论如何,搜索线程池是每个搜索操作的入口点。这背后的原理是,如果您在搜索线程池中获得了一个位置,您应该能够完成搜索,而且相当快。

作为此提交的一部分,我们还引入了取消尚未启动的任务的功能,以便如果任何任务引发异常,则其他任务将无法启动不必要的计算。

8.12 版本

What’s new in 8.12 | Elasticsearch Guide [8.12] | Elastic

int8量化

添加了一个名为int8_hnsw 的新索引类型。该类型会自动将 float32 值量化为 int8 字节值。虽然这会增加 25% 的磁盘使用量,但会将快速 HNSW 搜索所需的内存减少 75%。大大减少了密集向量搜索所需的资源开销。但准确度会略有下降。

使用例子

PUT vectors
{
  "mappings": {
    "properties": {
      "my_vector": {
        "type": "dense_vector",
        "index": true,
        "index_options": {
          "type": "int8_hnsw"
        }
      }
    }
  }
}

查询阶段在单个分片内启用并行检索

在之前,es默认在分片中,是串行执行检索的。单个分片可能有几十个segment,它们都是排队串行执行的。8.12版本,开始默认并发执行。

此前,对索引进行merge,可显著提升性能。分片内改为并行检索后,如果CPU资源充足,即使不做merge也会有提升。

虽然此优化,并不是针对knn检索做的优化,但是knn会受益。

8.14 版本

What’s new in 8.14 | Elasticsearch Guide [8.14] | Elastic

A SIMD (Neon) optimised vector distance function for merging int8 Scalar Quantized vectors has been added

已添加针对 aarch64 的优化 int8 向量距离实现。此实现目前仅在合并期间使用。向量距离实现在二进制比较方面比 Lucene 的 Pamana Vector 实现好大约 5 倍(取决于维度数量)。它通过将 SIMD(Neon)内在函数编译到单独的本机库中并由 Panama 的 FFI 链接来实现这一点。比较是在堆外 mmap 向量数据上执行的。宏基准测试 SO_Dense_Vector 在启用标量量化的情况下,合并时间显著改善,大约快了 3 倍。

8.15 版本

What’s new in 8.15 | Elasticsearch Guide [8.15] | Elastic

int4 量化

通过两种新索引类型支持新的 int4(半字节)标量量化:int4_hnsw和int4_flat。这可将 减少 8 倍,但会float32造成一定程度的准确度损失。除了所需的内存更少之外,与原始向量相比,这还显著提高了查询和合并速度。

ZStandard 替换 LZ4压缩算法

现在,通过将文档拆分成块来压缩存储字段,然后使用 ZStandard 单独压缩这些块。index.codec: default (默认)使用最多 14kB 的块或 128 个文档,以级别 0 压缩,而index.codec: best_compression使用最多 240kB 的块或 2048 个文档,以级别 3 压缩。在我们测试的大多数数据集上,这带来了 10% 左右的存储改进、略快的索引速度和相似的检索延迟

这里需要验证,是否对向量字段有压缩。如果有压缩,则对预加载向量数据的优化有收益,可以节省内存。

这篇关于ES 近一年新版本,关于knn的新功能与优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111947

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.