Elasticsearch from+size 超过10000结果解决方法

方法一:

如果需要搜索分页,可以通过from size组合来进行。from表示从第几行开始,size表示查询多少条文档。from默认为0,size默认为10, 
如果搜索size大于10000,需要设置index.max_result_window参数 
注意:size的大小不能超过index.max_result_window这个参数的设置,默认为10,000。 

PUT _settings
{
    "index": {
        "max_result_window": "10000000"
    }
}

方式二:

使用 scroll 代替,官方推荐方式。

优缺点:

方式一,当结果足够大的时候,会大大加大内存和CPU的消耗。使用非常方便。

方式二: 当结果足够大的时候, scroll 性能更加。但是不灵活和 scroll_id 难管理问题存在。

个人测试:当 结果足够大的时候 产生 scroll_id 性能也不低。如果只是一页页按照顺序,scroll是极好的,但是如果是无规则的翻页,那也是性能消耗极大的。

以上转载自

http://blog.youkuaiyun.com/qq_18145031/article/details/53489370


java方法实现

1 用from size

SearchResponse response = searchRequestBuilder
        .setQuery(mustQuery)
        .addSort(SortBuilders.fieldSort("@timestamp").order(SortOrder.DESC))
        .setFetchSource(INCLUDE_FIELDS, null)
        .setFrom(0)
        .setScroll(TimeValue.timeValueMinutes(2))
        .setSize(10000)
        .setExplain(true)
        .execute().actionGet();
2 scroll,

方法功能:取出全部的数据,一次取10000条,只是取分页某一页的话需要修改方法

public List<SecurityEventDTO> queryEventInformationAll(SecurityEventQueryInfoDTO condition) throws Exception {
    SecurityEventDTOMapper securityEventDTOMapper = new SecurityEventDTOMapper();
    Long timeStart = System.currentTimeMillis();
    //建立ES客户端
    TransportClient client = createTransportClient();
        List<SecurityEventDTO> resultList = new LinkedList<>();
        //设置查询条件并执行查询----重点
        BoolQueryBuilder mustQuery = QueryBuilders.boolQuery();
        mustQuery.must(QueryBuilders.matchAllQuery()); // 匹配所有文档
        mustQuery = setRequestBuilderByQueryInfo(mustQuery, condition);
        SearchRequestBuilder searchRequestBuilder = client.prepareSearch(indexName)
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
        SearchResponse response = searchRequestBuilder
                .setQuery(mustQuery)
                .addSort(SortBuilders.fieldSort("@timestamp").order(SortOrder.DESC))
                .setFetchSource(INCLUDE_FIELDS, null)
                .setFrom(0)
                .setScroll(TimeValue.timeValueMinutes(2))
                .setSize(10000)
                .setExplain(true)
                .execute().actionGet();

        do {
            Long time1 = System.currentTimeMillis();
            logger.info("开始执行时间" + DEFAULT_SIMPLE_DATE_FORMAT.format(new Date()));
            //解析结果
            SearchHit[] hits = response.getHits().getHits();
            if(hits.length > 0) {
                resultList.addAll(securityEventDTOMapper.ESResponseResultTODTOListMapper(hits));
            }
            Long time2 = System.currentTimeMillis();
            logger.info("1万条添加完成时间" + (time2 - time1));
            response = client.prepareSearchScroll(response.getScrollId()).setScroll(TimeValue.timeValueMinutes(4)).execute().actionGet();
            logger.info("1万查询完成时间" + (System.currentTimeMillis() - time2));
        } while (response.getHits().getHits().length != 0);

        client.close();
    Long timeEnd = System.currentTimeMillis();
    logger.info("-----------------------全部查询"+resultList.size()+"条,完成时间" + (timeEnd - timeStart)/1000);
    return resultList;
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值