【问题标题】:ElasticSearch pagination by ScrollApi move forward and backwardScrollApi 的 ElasticSearch 分页向前和向后移动
【发布时间】:2019-07-11 14:30:10
【问题描述】:

是否可以在 ElasticSearch 中使用 ScrollApi 进行分页向前和向后移动?

经典解决方案(setFrom(), setSize())不适合,因为 windows_size 太小了。

scrollApi 下面的代码适用于无限滚动。

if (parameters.getOffset() == 1) {
    SearchRequestBuilder searchRequestBuilder = client.prepareSearch(MY_INDEX).setTypes(documentsType);
    //...
} else {
    //
    SearchResponse scrollResponse = client.prepareSearchScroll(parameters.getScrollId())
            .setScroll(TimeValue.timeValueMinutes(1)).get();
    //...
}

【问题讨论】:

    标签: java elasticsearch pagination


    【解决方案1】:

    是的,当总结果数超过 10000 时,可以使用滚动 api 对响应进行分页。 它是这样工作的: 1.先用scroll关键字和大小搜索ES(表示每页的结果数) 2. 所以 ES 会返回你的第一批结果和一个滚动 id。 3. 下次调用 ES 时需要传递相同的滚动 ID 以及 size 参数以获取下一批等。

    如果您有前端,则可以在结果中传递滚动 ID,以便 UI 的下一次调用在请求中包含该 ID,您可以在后端服务中使用它来进行 ES 调用。

    有详细信息的官方网站-https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html

    【讨论】:

    • 是的,这正是我在上面的代码中所做的。这个例子工作正常。但要求是从页面跳转到页面。是否可以从第1页跳转到第N页?
    • 您的问题说您想向前滚动。不管怎样,这篇文章看起来很相似,stackoverflow.com/questions/47278321/…。您可能必须跳过后端的结果才能到达页面并使用后搜索功能进行优化。
    【解决方案2】:

    您可以更改您的设计以一次性加载多个页面的数据并返回到前端,并让前端处理分页。让我们说每页要显示 10 条记录,然后获取 50 条记录并返回到前端。如果用户在这 5 个页面之间滚动,则后端没有请求。只有当用户请求下一组然后使用滚动 api 跳过技术(我知道它仍然可能很慢)并获取接下来 5 页的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-30
      相关资源
      最近更新 更多