查询 elasticsearch 出现all shards failed异常 的解决方案
原文地址:juejin.cn/post/6914083794806898695
·
查询 elasticsearch 出现all shards failed异常 的解决方案
1.问题描述:
线上在查询es数据时报了all shards failed 的异常。
elastic: Error 500 (Internal Server Error): all shards failed [type=search_phase_execution_exception]
解决方法:
经过分析发现es默认的查询时一万条数据,当时查询的数据已超过了一万条,后来改成了分页查询之后就正常了。
Elasticsearch设置最大返回条数:
在Elasticsearch中如果需要做分页查询,我们通常使用form和size实现。form指定从有序哪一行开始,size表示从当前开始读取多少行。但是我们发现查询结果最大只能到10000,这是因为Elasticsearch中的size的默认值在index.max_result_window 中设置,并且默认值就是10000。
改动的代码 :`
boolean flag = false;
int pageNO= 0;
do {
try {
Pageable page = PageRequest.of(pageNO, 100);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.filter(QueryBuilders.termQuery("hotelCode",queryDeviceEsDTO.getHotelId()));
boolQueryBuilder.filter(QueryBuilders.termsQuery("roomNo",queryDeviceEsDTO.getRoomNos()));
boolQueryBuilder.filter(QueryBuilders.termsQuery("categoryType",acDeviceList));
boolQueryBuilder.filter(QueryBuilders.termQuery("isDelete",0));
FieldSortBuilder createTimeSort = SortBuilders.fieldSort("id").order(SortOrder.DESC);
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
NativeSearchQuery build = nativeSearchQueryBuilder.withQuery(boolQueryBuilder).withPageable(page)
.withSort(createTimeSort).build();
Iterable<Device> devices = deviceDao.search(build);
Iterator<Device> iterator = devices.iterator();
List<DeviceESModel> moreData =new ArrayList<>();
while(iterator.hasNext()){
Device next = iterator.next();
DeviceESModel device = BeanMapping.map(next, DeviceESModel.class);
deviceModels.add(device);
moreData.add(device);
}
if(moreData.size() >=100){
pageNO++;
flag =true;
}else {
flag =false;
}
}catch (Exception e){
e.getStackTrace();
log.error("es查询异常--------");
}
}while (flag);
更多推荐
已为社区贡献1条内容
所有评论(0)