面试题答案
一键面试search_after
- 特点:基于上一次查询结果的最后一条数据的排序值进行下一页查询,每次查询都实时从索引中获取数据。这意味着它能反映出查询瞬间索引中数据的最新状态,对于数据一致性保证较好,因为每次查询都是基于最新的数据状态进行分页。
- 局限性:由于每次查询都需要依赖上一次查询的结果,在分布式环境下,如果上一次查询的最后一条数据在后续查询时发生了更新,可能会导致数据一致性问题。例如,在高并发更新场景中,当上一次查询的最后一条数据在本次查询前刚刚被更新,可能会导致数据的重复或遗漏。
scroll
- 特点:在首次查询时,Elasticsearch会创建一个快照,后续的分页查询都基于这个快照。这保证了在整个滚动过程中,数据的一致性,无论数据在索引中如何更新,滚动查询返回的数据集合是固定的。
- 局限性:创建的快照会占用额外的资源,长时间的滚动查询可能导致资源耗尽。而且由于它基于快照,在滚动过程中无法反映出索引中数据的实时更新,可能返回的数据不是最新的,对于需要实时数据一致性的场景不太适用。
选择方式
- 实时性要求高:如果业务需要实时获取最新数据,并且对数据一致性要求相对宽松(即允许在高并发更新场景下有极小的数据不一致概率),应选择
search_after
。例如在实时监控系统中,虽然数据不断更新,但能获取到接近实时的最新数据更重要。 - 数据一致性要求严格:当业务对数据一致性要求极高,不允许在分页过程中有数据更新导致的不一致情况,且对数据实时性要求不高时,
scroll
是更好的选择。例如在生成财务报表等场景,需要确保整个报表数据基于同一时间点的一致性数据。