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

Bri*_*box 9 elasticsearch

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

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

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

wri*_*mus 6

您可以使用search_after。基本流程如下:

  1. 执行常规搜索以返回按日期排序的文档结果数组。
  2. 使用正文中的字段执行下一个查询search_after,以告诉 Elasticsearch 仅返回指定文档(日期)之后的文档。

这样,您的结果就可以在任何更新或文档删除的情况下保持稳健并保持准确。您还可以避免从初始文档结果开始的每个查询的滚动成本(您可能已经读过)和from/size方法的线性时间操作成本。

请参阅文档以获取更多信息和实现细节。


Tho*_*asC 5

from/size当您想进行深度分页要按页面请求大量结果时,效率非常低。

原因是结果首先在每个分片上排序,然后所有这些结果由请求协调器节点收集,合并和排序。随着页面尺寸或等级的增加,这变得越来越昂贵。您会在此处找到一个很好的例子。

您可以限制用户查询的大小(例如,约1000个结果),并且可以使用from/size

如果不是一种选择,您仍然可以使用滚动,但是您将失去诸如聚合之类的某些功能,而保持搜索上下文的生存需要付出一定的代价

  • 我知道这是一个旧帖子。但是滚动中丢失聚合仍然是真的吗?https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-request-scroll.html 提到初始搜索响应中包含聚合。 (2认同)