前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elasticsearch向量搜索深度解析:与OpenSearch插件实现的比较与评估

Elasticsearch向量搜索深度解析:与OpenSearch插件实现的比较与评估

原创
作者头像
点火三周
发布2024-03-25 21:41:28
1K0
发布2024-03-25 21:41:28
举报
文章被收录于专栏:Elastic Stack专栏Elastic Stack专栏

引言

在信息检索领域,向量搜索技术近年来成为了一个热门话题,它通过将文本转化为向量的方式,实现了更加精准和高效的搜索结果。在众多搜索引擎和数据库中,Elasticsearch和OpenSearch都提供了向量搜索的支持,但它们在实现方式上存在显著差异。Elasticsearch将向量搜索作为其核心功能之一直接内置于系统中,而OpenSearch则通过插件的形式提供类似功能。这种差异不仅影响了开发者的使用体验,也在性能和灵活性上造成了不同的影响。因此,理解这两种实现方式的特点及其背后的技术细节,对于选择合适的搜索解决方案至关重要。

Elasticsearch向量搜索简介

Elasticsearch 是一个高度可扩展的开源全文搜索和分析引擎,它允许用户快速、实时地存储、搜索和分析大量数据。正如我们在文章 Elasticsearch 中的向量搜索:设计背后的基本原理 中介绍的,Elasticsearch 的向量搜索是在 Lucene中原生实现,充分利用了其分布式架构。dense vector数据类型与其他数据类型一样,以相同的方式集成到 Lucene 的段文件中

新向量在索引时首先缓冲到内存中,当索引缓冲区满或需要使更改可见时,这些缓冲区会被序列化并成为段的一部分。这些段随后会定期合并,以优化搜索时间开销和控制段的总数。

Lucene采用分层可导航小世界(HNSW)算法来索引向量。HNSW通过将向量组织成图形结构,其中相似的向量相互连接,优化了搜索过程。这种方法因其简单性、良好的基准表现以及支持增量插入而受到青睐。

而搜索操作需要考虑索引中所有段的top向量命中,并且必须能够识别并排除标记为已删除的文档。在最新的 Elasticsearch 版本中,Elasticsearch 通过在多个段中并发的进行向量搜索来提升性能,并通过采用类似 MaxBlockWAND 的算法来跳过不包含竞争力的段,以提升访问延时。

这样做,最大的好处在于,将向量搜索作为Lucene索引的一部分,确保了向量搜索能与Elasticsearch的其他特性如跨集群搜索、快照/恢复等无缝集成,同时,利用Lucene的段策略和页面缓存,向量搜索的实现在性能上得到了优化:

  • 数据集可扩展超过RAM总大小
  • 支持无锁搜索,提高并发效率
  • 支持多图搜索,降低搜索延迟
  • 支持增量更改,随时添加、删除或更新新向量
  • 与其他数据结构的可见性一致性,确保搜索结果准确
  • 增量快照,保持搜索效率
  • 支持过滤和混合搜索,与其他功能高效集成(跨集群搜索,ES|QL)
  • 兼容其他功能,如聚合、安全性、排序等。

Elasticsearch向量搜索的关键里程碑

  • 2019年:Elasticsearch 7.0版本引入了向量搜索的初步支持,通过dense_vector字段类型,允许用户存储密集向量并进行余弦相似度计算。这标志着Elasticsearch正式进入了向量搜索领域。
  • 2020年:随着版本的持续迭代,Elasticsearch增加了对向量的更多操作和功能,如向量的脚本评分和向量字段的更复杂查询能力。
  • 2021年:Elasticsearch 7.12版本发布,引入了k-最近邻(k-NN)搜索功能的实验性支持,使得基于相似度的搜索变得更加高效。这一功能的加入大大增强了Elasticsearch处理向量搜索的能力。
  • 2022年及之后:Elasticsearch继续在向量搜索领域深化和扩展,包括优化向量搜索的性能,扩展向量搜索相关的API,以及引入新的机器学习集成,使得从文本到向量的转换和搜索更加灵活和强大。

OpenSearch向量搜索概述

OpenSearch则是从Elasticsearch 7.10版本之后拉出的一个由AWS维护的分支。与Elasticsearch相似,它也提供了丰富的全文搜索功能。不同的是,OpenSearch对向量搜索的支持主要是通过名为nmslib和faiss的外部库,并作为插件进行了深度集成。

Opensearch尝试通过整合C++编写的nmslib和faiss库来实现向量搜索,这两个库专门为近似k-NN(最近邻)搜索做了优化。虽然这种方法在理论上能提高处理大规模高维向量搜索的效率和精度,但这种集成并非没有挑战。Opensearch需要 通过Java Native Interface (JNI)来创建一个桥接,使得基于Java的Opensearch环境能够直接调用这些外部库。这不仅增加了系统的复杂性,还可能引入与外部环境的依赖问题。

在Opensearch中,通过nmslib或faiss生成的索引被称为“本地库索引”(Native library indexes)。这些索引在索引构建阶段被创建,并在第一次搜索时加载到内存中。Lucene按顺序搜索每个段,并在分片级别返回基于分数的最顶部的结果数量(更高的分数=更好的结果)。使用外部索引,意味着在混合搜索时,Opensearch只能将多路召回的结果进行简单的合并,并且无法对同一数据结构中的其他字段进行有机的混合查询

在资源分配方面,Opensearch集群中一定比例的RAM被预留给JVM堆,而k-NN插件只能使用剩余RAM的一部分用户加载所谓的Native library indexes。默认情况下,这个限制被设置为50%,但这也意味着在非常多元化的查询构成下,除非配备了大量的内存,否则Native library indexes将和其他的Lucene原生数据结构,反复堆外内存。

总的来说,虽然Opensearch通过集成nmslib和faiss来提供向量搜索功能的尝试值得肯定,但这种方法带来的系统复杂度、初始查询延迟、资源分配限制和维护负担等问题,都在一定程度上影响了用户体验和系统性能。对于那些寻求高效、稳定且低延迟的向量搜索解决方案的用户来说,这些问题可能会成为选择Opensearch的障碍。

OpenSearch向量搜索的关键里程碑

2021年:OpenSearch项目启动,由Amazon Web Services(AWS)领导,基于Elasticsearch 7.10.2和Kibana 7.10.2的代码分支。虽然在初始发布时并未包含专门的向量搜索功能,但随后的更新迅速跟进了向量搜索领域的发展。

2021年下半年:OpenSearch开始引入向量搜索功能,通过插件形式支持密集向量的存储和相似度搜索,与Elasticsearch的向量搜索功能类似。

2022年:OpenSearch进一步增强了其向量搜索能力,包括引入k-NN算法的支持,以及优化向量搜索的性能和可用性。

Elasticsearch与OpenSearch的比较

当我们深入比较Elasticsearch和OpenSearch在向量搜索实现上的差异时,可以从几个维度进行考察:性能、易用性、扩展性和生态系统。

  • 性能:Elasticsearch将向量搜索作为核心功能内置,可能在处理向量搜索查询时提供更优化的性能。相比之下,OpenSearch通过插件方式实现向量搜索可能在某些情况下面临性能瓶颈。
  • 易用性:Elasticsearch提供了相对直接的向量搜索支持,无需额外的配置即可使用,这对于希望快速部署向量搜索功能的用户来说是一个优势。而OpenSearch虽然需要通过安装插件来启用向量搜索,但提供了更高的自定义空间。
  • 扩展性和生态系统:OpenSearch的插件机制提供了强大的扩展性,用户可以通过安装不同的插件来扩展其向量搜索功能。Elasticsearch虽然在默认安装中已经集成了向量搜索,但通过其丰富的API和集成选项,也能实现高度的定制化和扩展。

Elasticsearch与OpenSearch的比较

在对Elasticsearch和Opensearch的向量搜索实现进行比较时,我们可以从性能、易用性、扩展性和生态系统四个维度来探讨它们之间的差异。

性能

Elasticsearch:Elasticsearch的向量搜索是直接在Lucene层面集成的,利用了分层可导航小世界(HNSW)算法,这种集成方式减少了对外部依赖,从而能够提供稳定且高效的搜索性能。因为数据和索引是存储在同一架构下,Elasticsearch能够有效管理资源,减少加载时间,尤其是通过优化的内存管理、索引合并策略与段并发查询策略

另外,得益于 Java 20中的Panama项目,从8.9版本开始,Elasticsearch上的向量搜索,受益于SIMD指令的应用,性能得以大幅提升。

Opensearch:虽然Opensearch引入了nmslib和faiss这两个强大的C++库来实现向量搜索,但由于这些实现是以插件形式存在的,并通过JNI与Java环境沟通,可能会引入额外的性能开销。对于需要快速响应的应用来说,可能会成为性能瓶颈。

易用性

Elasticsearch:由于Elasticsearch的向量搜索功能是内置的,用户无需安装额外的插件或进行复杂配置即可使用。这种无缝集成的方式为用户提供了更加简洁明了的使用体验。

Opensearch:Opensearch通过插件提供向量搜索功能,虽然这增加了系统的灵活性,但同时也要求用户关注插件的安装、配置和版本兼容性,以及与插件相关的API参数。对于非专业用户来说,这可能会增加使用上的难度。

扩展性

Elasticsearch:Elasticsearch的向量搜索能力随着Lucene的持续优化而进步,由于其紧密集成的架构,Elasticsearch能够更好地控制内存和计算资源,为处理大规模数据提供了良好的扩展性。

Opensearch:使用nmslib和faiss提供的向量搜索能力理论上可以达到很高的性能,但实际上可能受限于JNI调用的开销和资源竞争。此外,对于在JVM之外运行的本地库,难以做到精确的资源管理和预估。

生态系统

Elasticsearch:Elasticsearch背后有一个强大的社区和丰富的插件生态系统支持,用户可以轻松找到帮助和资源。其向量搜索的进步也能够从社区的贡献和反馈中受益。

Opensearch:Opensearch尝试通过开放和灵活的插件机制吸引更多的开发者参与,但是对于特定的向量搜索插件,可能需要依赖特定社区的活跃度和维护情况。

总结

综上所述,Elasticsearch和OpenSearch在向量搜索的实现上各有千秋。选择哪一个取决于具体的应用场景、性能要求、以及用户对易用性和扩展性的偏好。在接下来的部分,我们将探讨这两个平台的应用场景和最佳实践,为您提供实际的指导和建议。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • Elasticsearch向量搜索简介
    • Elasticsearch向量搜索的关键里程碑
    • OpenSearch向量搜索概述
      • OpenSearch向量搜索的关键里程碑
      • Elasticsearch与OpenSearch的比较
      • Elasticsearch与OpenSearch的比较
        • 性能
          • 易用性
            • 扩展性
              • 生态系统
              • 总结
              相关产品与服务
              Elasticsearch Service
              腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档