bra*_*ido 9 paging pagination elasticsearch
具体来说,我正在使用Elasticsearch进行分页,但这个问题可能适用于任何数据库.
Elasticsearch提供了使用方便和参数对搜索结果进行分页的方法.fromto
所以我运行一个查询 get me the most recent data from result 1 to 10
这非常有效.
用户单击"下一页",查询为:
get me the most recent data from result 11 to 20
问题是,在两个查询之间的时间内,2个新记录已添加到后备数据库,这意味着分页结果将重叠(第一页的最后2个显示为第二页上的前两个).
什么是避免这种情况的最佳解决方案?现在,我在查询中添加了一个过滤器,告诉它只包含比上一个查询的最后结果晚的结果.但它似乎只是hackish.
如果您已经为相关时间戳建立索引,则过滤器不是一个糟糕的选择.您必须在客户端跟踪该时间戳才能正确准备查询.你还必须知道何时摆脱它.但这些并非难以逾越的问题.
Scroll API是一个可靠的选项,因为它有效地在Elasticsearch方面快照.Scroll API的目的是为深度分页提供稳定的搜索查询,该查询必须处理您遇到的确切更改问题.
您可以通过提供查询和Elasticsearch返回的参数来开始滚动搜索.然后,您发出提供该ID的请求,每个ID都返回一个结果页面,并返回新的下一个请求.scrollscroll_id/_search/scrollscroll_id
(请注意,您不需要scan此处的搜索类型.这用于集中提取文档,并且不应用任何排序.)
与过滤相比,您仍然需要跟踪一个值:scroll_id您的下一页结果.这比跟踪时间戳更容易取决于您的应用.
还有其他潜在的缺点需要考虑.Elasticsearch会在群集中的单个节点上保留搜索的上下文.可以想象,这些可能会累积在您的群集中,具体取决于您依赖滚动搜索的程度.您需要测试那里的性能影响.如果我没记错的话,滚动搜索也不会因节点故障或重启而持续存在.
Scroll API的ES文档提供了有关上述所有内容的详细信息.
底线:按时间戳过滤实际上并不是一个糟糕的选择.Scroll API是另一个有效的选项,专为类似的用例而设计,但并非没有缺点.