elasticsearch 如何处理跳过请求(from/size 参数)

tun*_*opj 5 elasticsearch

我正在部署一种多次使用 from 参数的方法。我希望了解“跳过”在弹性搜索或其他此类系统中的工作原理,以判断它会导致什么性能损失。

Art*_*wak 3

这取决于搜索类型。如果您使用默认值 ie query then fetch,那么要获取大小为 10 ( from: 190, size: 10) 的第 20 页,elasticsearch 将:

  • 向每个主分片询问前 200 个文档的 ID 和相关性分数(这些文档是从与查询匹配的所有文档中选择的,因此这意味着搜索整个索引,但这与仅获取第一页相同)
  • 合并结果,按相关性排序,并跳过此类合并列表中的 190 个热门命中,取后面的 10 个
  • 从相关分片中获取实际文档(即其中 10 个)

这意味着,如果您有 3 个主副本,那么 Elasticsearch 节点需要交换有关 3 * 200 = 600 个文档的信息。有一些优化可以使获取特别“远”的页面更加高效,但简而言之,每次获取下一页时都需要处理越来越多的文档。

如果您的用例涉及按顺序浏览结果集,请考虑滚动