我是ES的新手,并且对其滚动文档感到困惑。来自文档" 滚动不是针对实时用户请求,而是针对处理大量数据,例如为了将一个索引的内容重新索引到具有不同配置的新索引"。
然而......在同一页面上,它表示不使用from()和size()进行分页,因为它" 非常低效"。在描述搜索的Java API页面上,它显示了通过Scroll进行分页的示例。
所以,假设我想要一次显示排序的搜索结果,一个页面,建议使用哪种方法:从/ size或滚动?
答案 0 :(得分:4)
from/size
效率非常低。
原因是结果首先在每个分片上排序,然后所有这些结果由请求协调器节点收集,合并和排序。随着页面大小或排名的增长,这变得越来越昂贵。你会发现一个非常好的例子documented here。
您可以限制用户查询的大小(例如〜大约1000个结果),您可以使用from/size
。
如果它不是一个选项,您仍然可以使用滚动,但是您会丢失一些功能,例如聚合和keeping the search context alive has a cost。
答案 1 :(得分:2)
滚动和/尺寸都受到深度分页的影响。您可以通过以更大的步骤进行分页(例如,一次100个条目)来尝试混合方法,但是以较小的批次(即仅10个)显示UI。当用户继续转到页面时,在某些时候,您应该在用户被占用时触发下一批的另一个后台搜索任务。如果您跟踪这些会话并大致了解用户搜索的深度,您可以找到理想的结果集大小并滚动这些步骤。
在两者之间,我有更好的滚动体验,而不是来自/ size的响应时间,但是YMMV。归结为您的数据,分片设置等。
答案 2 :(得分:1)
您可以使用search_after
。基本流程如下:
search_after
字段执行下一个查询,告诉Elasticsearch仅返回指定文档(日期)之后的文档。这样,您的结果对于任何更新或文档删除都会保持稳健,并保持准确。您还可以从初始文档结果开始,避免scrolling costs(因为您可能已经阅读过)和from/size方法的线性时间运算成本。
有关详细信息和实施详情,请参阅docs。