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)
.setSize(5000)意味着每个client.prepareSearchScroll调用将检索每个分片5000个记录.您正在请求返回源,如果您的记录很大,则在内存中组装5000条记录可能需要一段时间.我建议尝试一个较小的数字.尝试100和10,看看你是否获得了更好的表现.
.setFrom(0) 没有必要.
我将在这里添加另一个答案,因为我对这种行为感到非常困惑,我花了很长时间才在@AaronM 的评论中找到答案
这适用于 ES 1.7.2,使用 java API。
我正在滚动/扫描 500m 记录的索引,但查询返回大约 400k 行。
我从 1,000 的滚动大小开始,这在我看来是网络与 CPU 的合理权衡。
这个查询运行得非常缓慢,大约需要 30 分钟才能完成,在从游标中提取之间有很长的停顿。
我担心这可能只是我正在运行的查询,并且不相信减小滚动大小会有所帮助,因为 1000 看起来很小。
但是,看到上面 AaronM 的评论,我尝试了 10 的滚动大小。
整个工作在 30 秒内完成(这就是我是否重新启动了 ES,所以大概与缓存无关)- 速度提高了大约 60 倍!!!
因此,如果您在滚动/扫描方面遇到性能问题,我强烈建议您尝试减小滚动大小。我在互联网上找不到太多关于此的信息,因此将其发布在这里。
| 归档时间: |
|
| 查看次数: |
10771 次 |
| 最近记录: |