【记一次Excel的批量导出】

本文记述了一次批量导出Excel过程中遇到的挑战,包括ES查询结果窗口限制,默认配置调整,返回值缓存大小问题及解决方法。通过使用ES的游标查询(Scroll)优化了查询时长,并解决了后台查询超时的问题,最终成功实现批量导出。
摘要由CSDN通过智能技术生成

概述

需求,某私有化客户需要对聊天搜索的结果,进行批量导出,最大量达到17W,而我们目前情况一次只能导出1W

解决思路

  1. 目前导出瓶颈1W在于,查询方式为ES集群,返回值最大结果集默认为1W。 index.max_result_window:10000
  2. 修改默认返回值配置 index.max_result_window:200000
    (弊端:会影响整体ES性能,由于是私有化客户独立服务器,且非长期需求,所以,改!)
  3. 返回值超过缓存大小报错,利用反射修改es配置工厂
  4. 还是无法突破上限,改为es游标查询
  5. 后台查询时长超过nginx判定超时,优化查询时长+异步

实战

  1. 原查询方式(ES查询瓶颈,默认配置返回值1W条)
	public List<ChatSearch> search(String corpid, ChatSearchParam param) throws IOException {
   
        String corpId = param.getCorpId();
        List<ChatSearch> chatList = new ArrayList<>();
        RestHighLevelClient esClient = esConfig.getESClient(corpId);
        SearchRequest request = searchByEs(param);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
        for (SearchHit hit : response.getHits().getHits()) {
   
            chatList.add(JSONObject.parseObject(hit.getSourceAsString(), ChatSearch.class));
        }
        fill(corpId, chatList);
        return chatList;
    }
    
	private SearchRequest searchByEs(ChatSearchParam param) {
   
        String corpId = param.getCorpId();
        //构建查询
        BoolQueryBuilder condition = QueryBuilders.boolQuery()
                .must(QueryBuilders.termQuery("corpid", corpId))
                .must(QueryBuilders.termQuery("chattype", 1))//0表示内部,1标识外部
                .must(QueryBuilders.termQuery("msgtype", "text"))
                .must(QueryBuilders.matchPhraseQuery("data", param.getContent()));
        if (!StringUtils.isBlank(param.getEndTime())) {
   
            condition.must(QueryBuilders.rangeQuery("msgtime").lte(param.getEndTime()));
        }
        if (!StringUtils.isBlank(param.getStartTime())) {
   
            condition.must(QueryBuilders.rangeQuery("msgtime").gte(param.getStartTime()));
        }
        if (param.getFrom() != null) {
   
            condition.must(QueryBuilders.termQuery("is_sales_send", param.getFrom()));
        }
        if (param.getGroup() != null) {
   
            condition.must(QueryBuilders.termQuery("isgroup", param.getGroup()));
        }
        if (!CollectionUtils.isEmpty(param.getSalesIds())) {
   
            condition.must(QueryBuilders.boolQuery()
                    .should(QueryBuilders.termsQuery("userid", param.getSalesIds()))
                    .should(QueryBuilders.termsQuery("talklist", param.getSalesIds()))
            );
        }
        SearchSourceBuilder requestBuilder = new SearchSourceBuilder()
                .query(condition)
                .sort("msgtime", param.getOrder())
                .size(param.getPageSize().intValue()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值