错误提示
elasticsearch result window is too large from + size must be less than or equal to 10000
原因
Elasticsearch 默认返回集在10000条以内。
解决办法
如果需要更多的返回值,有2种办法:
- 调整max_result_window, 好处是沿用现有的访问方式 , repository 和pageable都正常使用,弊端是其实不是官方推荐的方式,会影响速度,带来过大内存消耗。
curl -XPUT "http://localhost:9200/my_index/_settings" -d '{ "index" : { "max_result_window" : 500000 } }'
- 采用 Scan And Scroll For Big Result Set 英文手册原文
重点是Spring的手册并没有更新,只是代码更新了,3.1里面提到的方法elasticsearchTemplate.scan(searchQuery,1000,false) API里面根本不支持。
为此,我从github的测试代码中翻出了这宝贵的调用例子,成功调通,在这奉献给大家。
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria());
criteriaQuery.addIndices(INDEX_NAME);
criteriaQuery.addTypes(TYPE_NAME);
criteriaQuery.setPageable(new PageRequest(0, 10));
ScrolledPage<SampleEntity> scroll = (ScrolledPage<SampleEntity>) elasticsearchTemplate.startScroll( 1000, criteriaQuery, SampleEntity.class);
List<SampleEntity> sampleEntities = new ArrayList<>();
while (scroll.hasContent()) {
sampleEntities.addAll(scroll.getContent());
scroll = (ScrolledPage<SampleEntity>) elasticsearchTemplate.continueScroll(scroll.getScrollId() , 1000, SampleEntity.class);
}
elasticsearchTemplate.clearScroll(scroll.getScrollId());