MST
星途 面试题库

面试题:ElasticSearch深度分页可选参数的性能影响及优化

在ElasticSearch进行深度分页时,使用`from`和`size`参数会面临性能问题。请详细说明`scroll`参数和`search_after`参数在处理深度分页时的工作原理,以及它们对性能的影响有何不同,在实际项目中应如何根据业务场景选择使用。
11.0万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

scroll参数工作原理

  1. 首次请求:在初始的搜索请求中,通过设置scroll参数指定滚动的有效期,例如scroll=1m表示滚动窗口为1分钟。同时设置size指定每次返回的文档数量。此时Elasticsearch会创建一个快照,这个快照是在搜索请求执行时索引的一个静态视图。
  2. 后续请求:后续获取结果时,使用首次请求返回的_scroll_id进行滚动请求。Elasticsearch基于之前创建的快照按顺序返回文档,就像遍历一个固定的数据集。

search_after参数工作原理

  1. 首次请求:在搜索请求中,除了设置size外,需要指定一个唯一且排序的字段组合(通常是包含时间戳或唯一ID的字段)。Elasticsearch根据这些排序字段对文档进行排序,然后返回size数量的文档,并且在返回结果中包含最后一个文档的排序值。
  2. 后续请求:下一次请求时,使用上一次返回的最后一个文档的排序值作为search_after参数的值,Elasticsearch基于这个值继续从排序后的文档集中按顺序获取下一批size数量的文档。

对性能的影响不同

  1. scroll
    • 优点:在处理大量数据分页时,由于是基于快照,一次性加载大量数据时性能相对稳定,适用于需要快速获取大量数据进行离线处理等场景。
    • 缺点:维护快照会占用额外的资源,随着滚动窗口时间的延长,可能会占用较多内存,并且如果滚动窗口内索引数据有更新,滚动结果不会反映这些变化。同时,因为是基于快照,在高并发写入场景下,可能会出现数据不一致的情况。
  2. search_after
    • 优点:实时性较好,每次请求都是基于当前索引的最新状态。不占用额外的资源来维护快照,资源消耗相对较小。
    • 缺点:每次请求都需要基于排序字段进行查找定位,在数据量非常大且排序字段索引性能不佳时,性能可能会逐渐下降。如果排序字段不是全局唯一的,可能会导致数据重复或遗漏。

实际项目中的选择

  1. 离线数据分析场景:如果是进行离线数据分析,对数据实时性要求不高,且需要一次性获取大量数据,可以选择scroll。例如,每天凌晨对前一天的日志数据进行批量分析。
  2. 实时性要求高的场景:在实时性要求高的场景,如显示最新的商品列表,并且需要分页浏览,应选择search_after。这样用户每次看到的都是最新的商品排序结果。
  3. 资源敏感场景:如果系统资源有限,对内存等资源消耗较为敏感,search_after由于不占用额外快照资源,是更好的选择。例如在一些资源受限的边缘计算设备上的应用。