我想从索引中获取所有数据。由于项数太大而无法存储,因此我使用了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多次,因此无法并行滚动多次。
scrollId
我找到了http://elasticsearch-users.115913.n3.nabble.com/Multiple-scrolls- simultanious-td4024191.html,其中指出这是可能的-尽管我不知道他与ES的隶属关系。
难道我做错了什么?
搜索更多之后,我得到的印象是(相同scrollId)是设计使然。超时到期后(每次调用Elasticsearch扫描并滚动后将其重置-添加到新索引)。
因此,每个索引只能获得一个打开的滚动。
https://www.elastic.co/guide/zh-CN/elasticsearch/reference/current/search- request- scroll.html指出:
滚动并不是为了实时用户请求,而是为了处理大量数据,例如为了将一个索引的内容重新索引为具有不同配置的新索引。
因此,似乎我想要的不是故意的选项-可能是由于优化。
更新 如前所述创建多个卷轴不能这样做,但是当你使用滚动查询是一样的,这是唯一的真实。如果你scroll的,例如,另一个type,index或只是一个query,你可以有多个scrolls
scroll
type
index
query
scrolls