我想从索引中获取所有数据。由于项目数量对于内存来说太大,我使用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的关系。
我做错了吗?
答案 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
为另一个type
,index
或另一个query
,则可以有多个scrolls
答案 1 :(得分:0)
您可以同时滚动相同的索引,这就是elasticsearch-hadoop所做的。
只是,不要忘记在引擎盖下,索引由多个拥有数据的分片组成,因此您可以使用以下方式并行滚动每个分片:
.setPreference("_shards:1")