面试题答案
一键面试scroll参数工作原理
- 首次请求:在初始的搜索请求中,通过设置
scroll
参数指定滚动的有效期,例如scroll=1m
表示滚动窗口为1分钟。同时设置size
指定每次返回的文档数量。此时Elasticsearch会创建一个快照,这个快照是在搜索请求执行时索引的一个静态视图。 - 后续请求:后续获取结果时,使用首次请求返回的
_scroll_id
进行滚动请求。Elasticsearch基于之前创建的快照按顺序返回文档,就像遍历一个固定的数据集。
search_after参数工作原理
- 首次请求:在搜索请求中,除了设置
size
外,需要指定一个唯一且排序的字段组合(通常是包含时间戳或唯一ID的字段)。Elasticsearch根据这些排序字段对文档进行排序,然后返回size
数量的文档,并且在返回结果中包含最后一个文档的排序值。 - 后续请求:下一次请求时,使用上一次返回的最后一个文档的排序值作为
search_after
参数的值,Elasticsearch基于这个值继续从排序后的文档集中按顺序获取下一批size
数量的文档。
对性能的影响不同
- scroll:
- 优点:在处理大量数据分页时,由于是基于快照,一次性加载大量数据时性能相对稳定,适用于需要快速获取大量数据进行离线处理等场景。
- 缺点:维护快照会占用额外的资源,随着滚动窗口时间的延长,可能会占用较多内存,并且如果滚动窗口内索引数据有更新,滚动结果不会反映这些变化。同时,因为是基于快照,在高并发写入场景下,可能会出现数据不一致的情况。
- search_after:
- 优点:实时性较好,每次请求都是基于当前索引的最新状态。不占用额外的资源来维护快照,资源消耗相对较小。
- 缺点:每次请求都需要基于排序字段进行查找定位,在数据量非常大且排序字段索引性能不佳时,性能可能会逐渐下降。如果排序字段不是全局唯一的,可能会导致数据重复或遗漏。
实际项目中的选择
- 离线数据分析场景:如果是进行离线数据分析,对数据实时性要求不高,且需要一次性获取大量数据,可以选择
scroll
。例如,每天凌晨对前一天的日志数据进行批量分析。 - 实时性要求高的场景:在实时性要求高的场景,如显示最新的商品列表,并且需要分页浏览,应选择
search_after
。这样用户每次看到的都是最新的商品排序结果。 - 资源敏感场景:如果系统资源有限,对内存等资源消耗较为敏感,
search_after
由于不占用额外快照资源,是更好的选择。例如在一些资源受限的边缘计算设备上的应用。