当前位置: 代码网 > it编程>软件设计>交互 > ES性能优化最佳实践- 检索性能提升30倍!

ES性能优化最佳实践- 检索性能提升30倍!

2024年08月06日 交互 我要评论
虽然Elasticsearch是一款强大的搜索引擎技术,但在超大规模数据检索中,尤其是在处理大量检索关键词(150个以上)、对多个字段执行检索并使用脚本排序时,可能会面临严重的性能问题。在我们实际的业务中,检索的时间可能到达300秒,无法满足实时交互需求。本文带你打开一个新思路。在未添加任何资源的情况下,我把性能提升了30倍,请求时间控制在10s内。多数请求能在3秒5秒内完成。一起来看看我是如何做到的叭。

前言:检索性能问题 

       

  1. 复杂性查询的挑战:当涉及大量检索关键词和多字段检索时,查询变得复杂,需要更多计算资源来处理这些复杂的查询。这会导致性能下降。

  2. 脚本排序开销:使用脚本排序可以在排序时进行自定义计算,但脚本的执行会增加额外的计算负担,尤其在大规模数据集上。

  3. 分片和节点负载:elasticsearch分布式架构依赖于分片和节点,如果查询请求分布不均匀或某些节点负载过重,性能问题可能会显著增加。

  4. 内存和磁盘资源:大规模查询需要更多的内存和磁盘资源来存储索引和数据,因此,硬件资源的配置可能成为性能瓶颈。

 

一、综合排序检索性能提升

1.1 性能提升效果

优化前后响应时间如下图1所示

图1

1.1.1 性能对比说明

  1. 其中横轴为普通检索场景,由检索时间范围和检索关键词个数组成。纵轴是请求平均响应时间,单位为秒。
  2. 在坐标轴上,红色代表的是性能优化前的请求响应时间,绿色代表的是优化后的请求响应时间。黑色虚线代表的是目标线,目标为,单次请求在5s内。

1.1.2 响应时间影响因素:

  1. 检索资源越多(服务器),响应时间越短。
  2. 检索时间范围越大(一次检索数据越多),响应时间越长。目前支持最大的检索时间跨度为3个月。
  3. 检索关键词越多,响应时间越长。目前能够给业务开放支持的是 100个检索词。

1.1.3 优化后效果

  1. 整体性能提升效果明显,提升在 1~ 30倍
  2. 其中对于慢查询提升效果更好。对于检索时间范围越长,效果提升越好;对于检索关键词越多,效果提升越好。
  3. 最终的检索效果,检索关键词小于等于50个,响应时间可以控制在5s内,能够达到目标。其中只有检索时间跨度到3个月,检索关键词100无法达到5s内,目前是7s。

1.3 测试数据说明

性能提升前后测试数据如下图2:

  1. 测试对比数据由测试组同事提供
  2. 测试接口为服务总线生产环境,检索逻辑为实际的业务检索条件。响应时间略大于es的响应时间。其中有0.3~0.5花在网络传输上。
  3. 其中提升前,是指综合排序,使用脚本实现,是闻海2.0实现思路。提升后是指使用cutting off机制,对搜索进行优化。

图2

1.4 关于综合排序说明

综合排序,是业务上使用最频繁的一种数据排序方式,也是默认的排序方式。其可以结合多个字段以及es的bm25相关性分数,做一个综合的排序。在实现上,使用script提取每一条数据的n个字段,然后计算一个分数,并和es的相关性分数做融合。

其最大的优点是召回的数据质量好,可以满足相关性的排序效果

其最大的缺点是单次检索,有非常大的计算量,需要花费大量的资源。单个检索随着命中的数据变多,检索的时间复杂度增加,响应时间增加。使用script,需要对命中的所有数据做实时计算,计算过程需要将所需要的字段io出来,会产生大量小文件的io。由于每一条数据都需要做计算,索引,会占用大量的cpu资源,最终导致整体检索效果慢n倍,n>5。且随着关键词命中的结果集合增大,额外的io和cpu计算导致检索性能越来越差。50个检索词在三个月中,耗时39s。150个词在三个月数据中检索时间300s。

1.5 优化说明

1.5.1上述综合排序中的问题,归结为两点。

  1. 有脚本的存在,且需要实时计算。es中脚本排序是一种低性能的检索方式。
  2. 单次检索需要扫描全量的数据,且要对命中的数据做计算。单次检索复杂度高。其中最大检索时间跨度下,全部数据约450亿数据。最大检索关键词数下,100个检索关键词or的逻辑,能够命中上亿的数据。

1.5.2 针对问题,提出解决方案:

  1. 分数预处理机制:对于多个要参与排序的字段分数,可以提前计算好,用一个额外的字段承接此分数。此操作可避免实时计算,从io多个字段,变为io 一个字段。如下图所示,在数据处理层,在数据入es前,通过对数据的预处理,计算文档的质量分数。利用es的插入排序能力,将高质量的文档在插入的时候放在最前边检索。

  1. 避免扫描全量数据。利用数据写入排序,可以做到将高质量数据在存储上总是排在前边,优先被检索到。在数据根据质量有序以后,则请求可以做截断。优先遍历高质量数据,找到topk的满足条件的数据,此时分数也是最高的,达到召回条件后,则提前终止请求。

(0)

相关文章:

  • Axure的交互与情形

    Axure的交互与情形

    总的来说,使用 Axure 进行交互设计非常简单,使用 Axure 做交互主要有 6 个步骤:新建项目、添加页面、添加组件、设置交互、预览原型、导出文档。同时 ... [阅读全文]
  • 用VRTK4.0如何实现与UI交互(保姆级别教程)

    用VRTK4.0如何实现与UI交互(保姆级别教程)

    五步教你完成VR中与UI的交互新手教程1.导入Tilia.UnityUI-master包2.Tilia.UnityUI-master使用环境3.创建画布和设置4... [阅读全文]
  • 深度强化学习在虚拟现实中的潜力:从游戏到教育

    深度强化学习在虚拟现实中的潜力:从游戏到教育

    1.背景介绍深度强化学习(Deep Reinforcement Learning, DRL)是一种人工智能技术,它结合了神经网络和强化学习,具有很强的学习能力和... [阅读全文]
  • HarmonyOS 应用开发案例

    该组件多用于可视化等场景。TabBar在大部分的APP当中都能够使用到,不同的APP可能存在不一样的TabBar样式,Tab组件自带的TabBar属性对于部分效果无法满足,如页签中…

    2024年08月06日 软件设计
  • 16.4 云计算

    基本特性广域网络访问:允许异构客户端通过标准机制访问云服务。快速弹性:资源可以迅速扩张或缩减,以满足需求变化。计量服务:资源使用被监控、控制和报告,以实现透明性。按需自助服务:用户…

    2024年08月06日 软件设计
  • 从单体架构到微服务,大厂意外流出

    1.1、单体架构Web应用程序发展的早期,大部分web工程师将所有的功能模块打包到一起并放在一个web容器中运行,所有功能模块使用同一个数据库,同时,它还提供API或者UI访问的w…

    2024年08月06日 软件设计

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com