ElasticSearch文档说不要将滚动用于用户请求,仅用于数据转换

时间:2014-08-22 20:27:42

标签: elasticsearch

我是ES的新手,并且对其滚动文档感到困惑。来自文档" 滚动不是针对实时用户请求,而是针对处理大量数据,例如为了将一个索引的内容重新索引到具有不同配置的新索引"。

然而......在同一页面上,它表示不使用from()和size()进行分页,因为它" 非常低效"。在描述搜索的Java API页面上,它显示了通过Scroll进行分页的示例。

所以,假设我想要一次显示排序的搜索结果,一个页面,建议使用哪种方法:从/ size或滚动?

3 个答案:

答案 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。基本流程如下:

  1. 执行常规搜索,按日期返回排序文档结果数组。
  2. 使用正文中的search_after字段执行下一个查询,告诉Elasticsearch仅返回指定文档(日期)之后的文档。
  3. 这样,您的结果对于任何更新或文档删除都会保持稳健,并保持准确。您还可以从初始文档结果开始,避免scrolling costs(因为您可能已经阅读过)和from/size方法的线性时间运算成本。

    有关详细信息和实施详情,请参阅docs