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

这篇具有很好参考价值的文章主要介绍了ES性能优化最佳实践- 检索性能提升30倍!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        Elasticsearch是被广泛使用的搜索引擎技术,它的应用领域远不止搜索引擎,还包括日志分析、实时数据监控、内容推荐、电子商务平台、企业级搜索解决方案以及许多其他领域。其强大的全文搜索、实时索引、分布式性能和丰富的插件生态系统使其成为了许多不同行业和领域的首选技术。
        虽然Elasticsearch是一款强大的搜索引擎技术,但在超大规模数据检索中,尤其是在处理大量检索关键词(150个以上)、对多个字段执行检索并使用脚本排序时,可能会面临严重的性能问题。
        在我们实际的业务中,检索的时间可能到达300秒,无法满足实时交互需求。本文带你打开一个新思路。在 千亿级数据检索背景下,在 未添加任何资源的情况下,我把性能提升了 30倍,请求时间控制在 10s内。多数请求能在3秒5秒内完成。一起来看看我是如何做到的叭。

前言:检索性能问题 

       

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

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

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

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

 

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

1.1 性能提升效果

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

ES性能优化最佳实践- 检索性能提升30倍!,Elasticsearch,ES搜索优化,elasticsearch,大数据,搜索引擎,检索性能优化

图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机制,对搜索进行优化。

ES性能优化最佳实践- 检索性能提升30倍!,Elasticsearch,ES搜索优化,elasticsearch,大数据,搜索引擎,检索性能优化

图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的插入排序能力,将高质量的文档在插入的时候放在最前边检索。

ES性能优化最佳实践- 检索性能提升30倍!,Elasticsearch,ES搜索优化,elasticsearch,大数据,搜索引擎,检索性能优化

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

ES性能优化最佳实践- 检索性能提升30倍!,Elasticsearch,ES搜索优化,elasticsearch,大数据,搜索引擎,检索性能优化文章来源地址https://www.toymoban.com/news/detail-719810.html

到了这里,关于ES性能优化最佳实践- 检索性能提升30倍!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ES 8.x 向量检索性能测试 & 把向量检索性能提升100倍!

      向量检索不仅在的跨模态检索场景中应用广泛,随着chat gpt的火热,es的向量检索,在Ai领域发挥着越来越大的作用。   本文,主要测试es的向量检索性能。我从8.x就开始关注ES的向量检索了。当前ES已经发布到 8.10 版本。以下是官方文档的链接:    https://www.elastic.co/guide/

    2024年02月07日
    浏览(47)
  • ES forceMerge 强制段合并为什么会提升检索性能?

      根据以前的测试,forceMerge段合并,将段的个数合并成一个。带来了将近一倍的性能提升,测试过程文档(请参考我的另外一篇文章):ES优化实战- forceMerge搜索提升测试报告_es forcemerge_水的精神的博客-CSDN博客   注意,这次测试,只是这对一个长文本字段(就像一篇文章)

    2024年02月04日
    浏览(42)
  • 千万级数据的表,我把慢sql优化后性能提升30倍!

    背景:系统中有一个统计页面加载特别慢,前端设置的40s超时时间都加载不出来数据,因为是个统计页面,基本上一猜就知道是mysql的语句有问题,遗留了很久没有解决,正好趁不忙的时候,下定决心一定把它给搞定! (mysql5.7) 执行一下问题sql,可以看到单表查就需要61s 这

    2024年02月14日
    浏览(50)
  • 性能优化实践:一行代码性能提升几十倍?

    Part1 问题背景 在一般的互联网公司,大家都非常忙碌。活儿是永远干不完的。这时候,我建议先做重要的事情。试想:一个人永远都在做「紧急不重要」的事情,他的产出必然是非常低的。这就是为什么「重要不紧急」在第二象限,仅仅排在「重要且紧急」后面。 所以对于

    2024年04月28日
    浏览(37)
  • ElasticSearch 7.X系列之: 检索性能优化实战指南

    检索响应慢! 并发检索用户多时,响应时间不达标 卡死了! 怎么还没有出结果? 怎么这么慢? 为啥竞品产品的很快就返回结果了? 宕机了 等等...... 这些都与可能检索有关,确切的说和检索性能有关。 检索性能的优化涉及知识点比较零散,我以官方文档的检索性能优化部

    2023年04月08日
    浏览(47)
  • Node.js性能优化:实用技巧和最佳实践

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,广泛用于构建快速的、可扩展的网络应用。尽管 Node.js 已经为处理大量并发连接提供了强大的性能,但在实际开发中仍然需要采取一些策略来优化性能和提升应用响应速度。以下是一些实用的技巧和最佳实践,可以帮助开发

    2024年04月17日
    浏览(40)
  • Python web实战之Django性能优化最佳实践详解

    大家好!今天分享如何优化使用Django应用的性能,使其在高并发、大数据量的情况下能够保持良好的性能。 数据库查询是Web应用中常见的性能瓶颈之一。 1.1 使用select_related和prefetch_related 在Django中,可以使用 select_related 和 prefetch_related 方法来优化数据库查询。这两个方法可

    2024年02月11日
    浏览(56)
  • HTTP/2在Linux上的性能优化和最佳实践

    HTTP/2是互联网通信协议的最新版本,它在设计上大大提升了网页加载速度和服务器性能。尤其在Linux平台上,通过一系列的优化和最佳实践,我们可以进一步发挥HTTP/2的优势。 1. 启用HTTP/2 首先,确保你的Linux服务器上已经安装了支持HTTP/2的软件。对于Nginx,你需要使用1.9.5及更

    2024年01月16日
    浏览(50)
  • 选择结构还是类?C#中的最佳实践与性能优化指南

      概述: 在C#中,选择使用结构(struct)而非类(class)取决于数据大小、不可变性和性能需求。结构适用于小型、不可变的数据对象,具有轻量级和高性能的优势。然而,对于复杂对象和需要继承的情况,应选择类。以下是一个简单的结构示例,演示了结构在栈上分配内存

    2024年04月09日
    浏览(76)
  • mysql 27day 深入理解MySQL:架构、性能优化与最佳实践

    MySQL是一个流行的开源关系型数据库管理系统,深受开发者喜爱,广泛应用于各种网站和应用程序中。在本文中,我们将探索MySQL的内部架构,讨论常见的性能瓶颈,并提供一些针对性的优化建议。无论你是一名初学者还是有经验的数据库管理员,本文都将为你提供宝贵的My

    2024年02月03日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包