ElasticSearch Multiple Scrolls Java API

时间:2015-06-18 14:37:34

标签: java scroll elasticsearch parallel-processing

我想从索引中获取所有数据。由于项目数量对于内存来说太大,我使用Scroll(不错的功能):

client.prepareSearch(index)
    .setTypes(myType).setSearchType(SearchType.SCAN)
    .setScroll(new TimeValue(60000))
    .setSize(amountPerCall)
    .setQuery(MatchAll())
    .execute().actionGet();

调用时效果很好:

client.prepareSearchScroll(scrollId)
    .setScroll(new TimeValue(600000))
    .execute().actionGet()

但是,当我多次调用前一个方法时,我多次得到相同的scrollId,因此我不能多次滚动 - 并行。

我发现http://elasticsearch-users.115913.n3.nabble.com/Multiple-scrolls-simultanious-td4024191.html表示有可能 - 虽然我不知道他与ES的关系。

我做错了吗?

2 个答案:

答案 0 :(得分:2)

在搜索了一些之后,我得到的印象是这个(同一scrollId)是设计的。超时过期后(每次调用Elasticsearch scan and scroll - add to new index后重置)。

因此,每个索引只能打开一个滚动。

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html州:

  

滚动不适用于实时用户请求,而是适用于   处理大量数据,例如为了重新索引   一个索引的内容到具有不同配置的新索引中。

所以看来我想要的不是一个选择,故意 - 可能是因为优化。

<强>更新
如上所述,无法创建多个滚动,但仅当用于滚动的查询相同时才会这样。例如,如果您scroll为另一个typeindex或另一个query,则可以有多个scrolls

答案 1 :(得分:0)

您可以同时滚动相同的索引,这就是elasticsearch-hadoop所做的。

只是,不要忘记在引擎盖下,索引由多个拥有数据的分片组成,因此您可以使用以下方式并行滚动每个分片:

.setPreference("_shards:1")