我必须从弹性搜索中查询记录并将它们显示在页面大小为1000的网格中。我的索引可以包含超过100万条记录。
由于 index.max_result_window 的 10,000 个限制,我不再能够使用 from + size 查询进行分页。由于性能原因,我不想增加这个限制。
我正在使用滚动 API 进行分页和循环记录以显示所需的页面。例如如果有人请求第 9 页,我会滚动 9 次。
它对于初始页面效果很好,但你可以想象到最后一页非常慢。
我不是弹性搜索方面的专家,所以有什么改进的建议吗?
提前致谢
编辑2016年9月21日
版本:Elasticsearch 2.4.0
滚动示例:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html
滚动大小:1000
因此,如果我有 10,00,000 条记录要到达最后一页,我必须滚动 1000 次。
此外,用户还可以选择返回,这是滚动不支持的。所以我必须从头开始滚动。
我认为应该有更好的方法来做到这一点。
我相信,没有将排序类型设置为“_doc”的滚动查询的行为方式类似于增加
max result window
大小,因为您仍然按照分数顺序返回结果,您仍然需要付出深度分页的成本。
如果您不关心结果的顺序,请将排序设置为“_doc”。 请参阅这个。虽然这仍然不会让你回去,因为这不是滚动的工作原理。
如果您确实想要按分数顺序排列文档,并且还想随时切换页面,那么除了增加
max result window
大小之外没有其他方法。
增加 max result window
实际上不会以任何其他方式影响性能,直到您真正开始深度分页,并且如果您想要基于分数进行分页,则没有任何其他方法可以避免这种情况。
您唯一可以做的另一件事是在应用程序中异步请求所有页面并存储结果,然后在用户实际请求时从那里获取结果。