论文网站建设与运营,WordPress怎么注册,管理员网站,wordpress视频站代码Elasticsearch是被广泛使用的搜索引擎技术#xff0c;它的应用领域远不止搜索引擎#xff0c;还包括日志分析、实时数据监控、内容推荐、电子商务平台、企业级搜索解决方案以及许多其他领域。其强大的全文搜索、实时索引、分布式性能和丰富的插件生态系统使其成为了许多不同行… Elasticsearch是被广泛使用的搜索引擎技术它的应用领域远不止搜索引擎还包括日志分析、实时数据监控、内容推荐、电子商务平台、企业级搜索解决方案以及许多其他领域。其强大的全文搜索、实时索引、分布式性能和丰富的插件生态系统使其成为了许多不同行业和领域的首选技术。 虽然Elasticsearch是一款强大的搜索引擎技术但在超大规模数据检索中尤其是在处理大量检索关键词150个以上、对多个字段执行检索并使用脚本排序时可能会面临严重的性能问题。 在我们实际的业务中检索的时间可能到达300秒无法满足实时交互需求。本文带你打开一个新思路。在 千亿级数据检索背景下在 未添加任何资源的情况下我把性能提升了 30倍请求时间控制在 10s内。多数请求能在3秒5秒内完成。一起来看看我是如何做到的叭。 前言检索性能问题 复杂性查询的挑战当涉及大量检索关键词和多字段检索时查询变得复杂需要更多计算资源来处理这些复杂的查询。这会导致性能下降。 脚本排序开销使用脚本排序可以在排序时进行自定义计算但脚本的执行会增加额外的计算负担尤其在大规模数据集上。 分片和节点负载Elasticsearch分布式架构依赖于分片和节点如果查询请求分布不均匀或某些节点负载过重性能问题可能会显著增加。 内存和磁盘资源大规模查询需要更多的内存和磁盘资源来存储索引和数据因此硬件资源的配置可能成为性能瓶颈。 一、综合排序检索性能提升 1.1 性能提升效果 优化前后响应时间如下图1所示 图1 1.1.1 性能对比说明 其中横轴为普通检索场景由检索时间范围和检索关键词个数组成。纵轴是请求平均响应时间单位为秒。在坐标轴上红色代表的是性能优化前的请求响应时间绿色代表的是优化后的请求响应时间。黑色虚线代表的是目标线目标为单次请求在5s内。 1.1.2 响应时间影响因素 检索资源越多服务器响应时间越短。检索时间范围越大一次检索数据越多响应时间越长。目前支持最大的检索时间跨度为3个月。检索关键词越多响应时间越长。目前能够给业务开放支持的是 100个检索词。 1.1.3 优化后效果 整体性能提升效果明显提升在 1~ 30倍。其中对于慢查询提升效果更好。对于检索时间范围越长效果提升越好对于检索关键词越多效果提升越好。最终的检索效果检索关键词小于等于50个响应时间可以控制在5s内能够达到目标。其中只有检索时间跨度到3个月检索关键词100无法达到5s内目前是7s。 1.3 测试数据说明 性能提升前后测试数据如下图2 测试对比数据由测试组同事提供。测试接口为服务总线生产环境检索逻辑为实际的业务检索条件。响应时间略大于ES的响应时间。其中有0.3~0.5花在网络传输上。其中提升前是指综合排序使用脚本实现是闻海2.0实现思路。提升后是指使用cutting off机制对搜索进行优化。 图2 1.4 关于综合排序说明 综合排序是业务上使用最频繁的一种数据排序方式也是默认的排序方式。其可以结合多个字段以及ES的BM25相关性分数做一个综合的排序。在实现上使用script提取每一条数据的N个字段然后计算一个分数并和ES的相关性分数做融合。 其最大的优点是召回的数据质量好可以满足相关性的排序效果。 其最大的缺点是单次检索有非常大的计算量需要花费大量的资源。单个检索随着命中的数据变多检索的时间复杂度增加响应时间增加。使用script需要对命中的所有数据做实时计算计算过程需要将所需要的字段IO出来会产生大量小文件的IO。由于每一条数据都需要做计算索引会占用大量的CPU资源最终导致整体检索效果慢N倍N5。且随着关键词命中的结果集合增大额外的IO和CPU计算导致检索性能越来越差。50个检索词在三个月中耗时39s。150个词在三个月数据中检索时间300s。 1.5 优化说明 1.5.1上述综合排序中的问题归结为两点。 有脚本的存在且需要实时计算。ES中脚本排序是一种低性能的检索方式。单次检索需要扫描全量的数据且要对命中的数据做计算。单次检索复杂度高。其中最大检索时间跨度下全部数据约450亿数据。最大检索关键词数下100个检索关键词OR的逻辑能够命中上亿的数据。 1.5.2 针对问题提出解决方案 分数预处理机制对于多个要参与排序的字段分数可以提前计算好用一个额外的字段承接此分数。此操作可避免实时计算从IO多个字段变为IO 一个字段。如下图所示在数据处理层在数据入ES前通过对数据的预处理计算文档的质量分数。利用ES的插入排序能力将高质量的文档在插入的时候放在最前边检索。 避免扫描全量数据。利用数据写入排序可以做到将高质量数据在存储上总是排在前边优先被检索到。在数据根据质量有序以后则请求可以做截断。优先遍历高质量数据找到topK的满足条件的数据此时分数也是最高的达到召回条件后则提前终止请求。