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

相关文章

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

基于SpringBoot实现文件秒传功能

《基于SpringBoot实现文件秒传功能》在开发Web应用时,文件上传是一个常见需求,然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余,此时可以使用文件秒传技术通过识别重复... 目录前言文件秒传原理代码实现1. 创建项目基础结构2. 创建上传存储代码3. 创建Result类4.

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

IDEA中Git版本回退的两种实现方案

《IDEA中Git版本回退的两种实现方案》作为开发者,代码版本回退是日常高频操作,IntelliJIDEA集成了强大的Git工具链,但面对reset和revert两种核心回退方案,许多开发者仍存在选择... 目录一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提