【问题标题】:Elastic search paging弹性搜索分页
【发布时间】:2017-01-27 08:01:13
【问题描述】:

我必须从弹性搜索中查询记录,并在页面大小为 1000 的网格中显示它们。我的索引可以包含超过 100 万条记录。

由于 index.max_result_window 的限制为 10,000,我不再能够使用 from + size 查询进行分页。由于性能原因,我不想增加此限制。

我正在使用滚动 api 进行分页和循环记录以显示所需的页面。例如如果有人请求第 9 页,我会滚动 9 次。

它适用于初始页面,但您可以想象转到最后一页非常慢。

我不是弹性搜索方面的专家,有什么改进的建议吗?

提前致谢

编辑 21/09/2016

版本:Elasticsearch 2.4.0

滚动示例:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html

滚动大小:1000

因此,如果我有 10,00,000 条记录才能到达最后一页,我必须滚动 1000 次。

此外,用户还可以选择返回,滚动不支持。所以我必须从头开始滚动。

我认为应该有更好的方法来做到这一点。

【问题讨论】:

  • 您使用的是哪个版本的 ES ?你能分享你的滚动查询吗?
  • 现在包含在描述中

标签: elasticsearch paging


【解决方案1】:

我相信,没有将排序类型设置为“_doc”的滚动查询的行为类似于增加max result window 大小,因为您仍然按照分数的顺序返回结果,您仍然需要支付深度的成本分页。

如果您不关心结果集的顺序,则排序为“_doc”。 见this。尽管这仍然不会让您返回,因为滚动不是这样工作的。

如果您确实希望文档按分数顺序排列并且还想随时切换页面,那么除了增加max result window 大小之外别无他法。 在您真正开始深度分页之前,增加max result window 实际上不会以任何其他方式影响性能,如果您想根据分数进行分页,实际上没有任何其他方法可以避免这种情况。

您唯一可以做的另一件事是在您的应用程序中异步请求所有页面并存储结果,然后在用户实际请求它们时从那里获取结果。

【讨论】:

  • 我尝试增加最大结果窗口,但服务器无法处理大型结果集。
  • 听起来使用弹性搜索在 UI 网格中显示数据不是一个好主意。
  • 页面大小为 1000 和一百万个文档的排序结果可能会强调任何可用的搜索解决方案,特别是如果它像弹性搜索一样分布。期望用户浏览第一页上的所有 1000 个结果也不太现实,更不用说所有数十万个结果(即使谷歌也无法显示这么多结果),但这实际上取决于您的用例。如果您出于某种原因仍想这样做,则必须进行一些巧妙的索引,将多个文档分组到一个文档中,并使用更聪明的查询与过滤器和脚本来获取结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 2016-05-20
相关资源
最近更新 更多