如何减少Elasticsearch滚动响应时间?

dra*_*nxo 5 java elasticsearch

我有一个查询返回来自我们集群中分布的7个不同索引的〜200K命中.我将结果处理为:

while (true) {
    scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(600000)).execute().actionGet();

    for (SearchHit hit : scrollResp.getHits()){
            //process hit}

    //Break condition: No hits are returned
    if (scrollResp.hits().hits().length == 0) {
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

我注意到client.prepareSearchScroll行可以在返回下一组搜索命中之前挂起很长时间.我运行代码的时间越长,这似乎越来越糟糕.

我的搜索设置是:

SearchRequestBuilder searchBuilder = client.prepareSearch( index_names )
    .setSearchType(SearchType.SCAN)
    .setScroll(new TimeValue(60000)) //TimeValue?
    .setQuery( qb )
    .setFrom(0) //?
    .setSize(5000); //number of jsons to get in each search, what should it be? I have no idea.
    SearchResponse scrollResp = searchBuilder.execute().actionGet();
Run Code Online (Sandbox Code Playgroud)

在检查许多结果时,预计扫描和滚动需要很长时间吗?我对弹性搜索很新,所以请记住,我可能会遗漏一些非常明显的东西.

我的查询:

QueryBuilder qb = QueryBuilders.boolQuery().must(QueryBuilders.termsQuery("tweet", interesting_words));
Run Code Online (Sandbox Code Playgroud)

imo*_*tov 7

.setSize(5000)意味着每个client.prepareSearchScroll调用将检索每个分片5000个记录.您正在请求返回源,如果您的记录很大,则在内存中组装5000条记录可能需要一段时间.我建议尝试一个较小的数字.尝试100和10,看看你是否获得了更好的表现.

.setFrom(0) 没有必要.

  • 关于这个问题比大批量快很多批次,我现在正在试验这个,在我的应用程序中发现我可以在 30 秒内完成滚动,大小为 10。如果我将大小增加到 100,总时间到 300 秒。非常奇怪的 IMO,但与他人分享我的经验。 (2认同)

use*_*465 7

我将在这里添加另一个答案,因为我对这种行为感到非常困惑,我花了很长时间才在@AaronM 的评论中找到答案

这适用于 ES 1.7.2,使用 java API。

我正在滚动/扫描 500m 记录的索引,但查询返回大约 400k 行。

我从 1,000 的滚动大小开始,这在我看来是网络与 CPU 的合理权衡。

这个查询运行得非常缓慢,大约需要 30 分钟才能完成,在从游标中提取之间有很长的停顿。

我担心这可能只是我正在运行的查询,并且不相信减小滚动大小会有所帮助,因为 1000 看起来很小。

但是,看到上面 AaronM 的评论,我尝试了 10 的滚动大小。

整个工作在 30 秒内完成(这就是我是否重新启动了 ES,所以大概与缓存无关)- 速度提高了大约 60 倍!!!

因此,如果您在滚动/扫描方面遇到性能问题,我强烈建议您尝试减小滚动大小。我在互联网上找不到太多关于此的信息,因此将其发布在这里。

  • 滚动大小减小得越多,执行的查询总数就会增加。假设您的搜索结果有 50K 总点击量,并且您将滚动大小保持为 10000,则查询执行 5 次,而滚动大小为 10 时查询执行次数少于 5000 次。查询执行时间通常在总体性能中占主要部分。因此不建议减小滚动尺寸。而scroll API主要是针对10000条以上的搜索结果,可以对结果进行分页。 (2认同)