查询 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);

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐