es筛选数据并导出excel

@RestController
public class ElasticSearchTestController {
    // 初始化Logger类:使用指定的类初始化 LoggerFactory,输出日志所在类的信息。
    private static Logger logger = LoggerFactory.getLogger(ElasticSearchTestController.class);

    private static String IP = "es地址";
    private static int Port = 9300;//集群端口用9300
    private static String index = "data";//es索引
    private static String type = "esa";//es表

    @PostMapping("/query")
    public void query() throws Exception {

        int size = 10000;  //设置每次滚动输出条数
        long startTime = System.currentTimeMillis();    //获取开始时间
        String path = "D:\\output\\test.xlsx";
        Settings esSettings = Settings.builder()
                .put("cluster.name", "elasticsearch") //设置ES实例的名称
                .build();
        TransportClient client = new PreBuiltTransportClient(esSettings)
                .addTransportAddress(new TransportAddress(InetAddress.getByName(IP), Port));
        //SearchRequestBuilder srb = client.prepareSearch("tbdata").setTypes("tmd").setFrom(0).setSize(size);
        SearchResponse response = client.prepareSearch(index).setTypes(type)
                .addSort(SortBuilders.fieldSort("_doc"))
                .setSize(size).setScroll(new TimeValue(600000)).execute()  //scroll每次循环时间,存在内存中,下次循环接着该ID继续
                .actionGet();
        //SearchResponse sr = srb.setQuery(QueryBuilders.matchAllQuery()).execute().actionGet(); // 查询所有
        long totalCount = response.getHits().totalHits;
        System.out.println("总条数是:"+totalCount);
        int page = (int) totalCount / size;
        XSSFWorkbook workbook = new XSSFWorkbook();//创建表
        XSSFSheet sheet = workbook.createSheet("test");//创建sheet页*/
        //把第一行字段行写入sheet
        createFirstRow(response, sheet);
        //把数据写入sheet
        createOtherRow(response, sheet);
        writeData(workbook, path);//写入excel表
        for (int i = 0; i < page - 1; i++) {
            System.out.println("第"+i+"次循环");
            //再次发送请求,并使用上次搜索结果的ScrollId
            response = client.prepareSearchScroll(response.getScrollId())
                    .setScroll(new TimeValue(600000)).execute()
                    .actionGet();
            createOtherRow(response, sheet);
            writeData(workbook, path);
        }
        long endTime = System.currentTimeMillis();    //获取结束时间
        System.out.println("运行时间:" + (endTime - startTime) + "ms");
        //处理结束后,记得clean scroll
        ClearScrollRequest requests = new ClearScrollRequest();
        requests.addScrollId(response.getScrollId());
        client.clearScroll(requests);
    }
  /**
     * 构造首行的结构,未设置字段类型
     */
    private void createFirstRow(SearchResponse response, XSSFSheet sheet) {
        if (response.getHits().getTotalHits() != 0) {
            XSSFRow row = sheet.createRow(0); //创建行
            Map<String, Object> map = response.getHits().getAt(0).getSourceAsMap();
            int k = 0;
            XSSFCell cell;
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                cell = row.createCell(k); //创建单元格
                cell.setCellValue(entry.getKey());
                k++;
            }
        }
    }
 /**
     * 把数据写入sheet
     */
    private void createOtherRow(SearchResponse response, XSSFSheet sheet) throws Exception {
        SearchHit[] hits = response.getHits().getHits();
        for (int i = 0; i < hits.length; i++) {
            Map<String, Object> sourceAsMap = response.getHits().getAt(i).getSourceAsMap();
            int k =0;
            String origin = (String) sourceAsMap.get("remark");
            if (origin.contains("通用")) {
                //String id = response.getHits().getAt(i).getId();
                System.out.println(origin);
                XSSFRow row1 = sheet.createRow(i+1);//从第一行开始写入
                for (Map.Entry<String, Object> entry : sourceAsMap.entrySet()) {
                    row1.createCell(k).setCellValue(entry.getValue().toString());
                    k++;
                }
            }
        }
    }
 /**
     * 导出数据到本地
     */
    private void writeData(XSSFWorkbook workbook, String path) {
        try {
            FileOutputStream fos = new FileOutputStream(path);
            workbook.write(fos);
            fos.flush();//刷新,下次循环接着写,不会覆盖之前的数据
            System.out.println("写入成功");
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

es版本需要和安装的版本一致

  <java.version>1.8</java.version>
        <elasticsearch.version>6.2.4</elasticsearch.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.2.4</version>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>6.2.4</version>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.2.4</version>
        </dependency>
       <!-- <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>5.6.3</version>
        </dependency>-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-examples</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-excelant</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>stax</groupId>
            <artifactId>stax-api</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.xmlbeans</groupId>
            <artifactId>xmlbeans</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.6.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>6.2.4</version>
        </dependency>

引用于:https://blog.csdn.net/qq_34624315/article/details/81364045

对于elasticsearch的海量数据导出,可以使用以下方法: 1. 使用Elasticsearch的Scroll API: 这种方法通过使用Scroll API来批量获取数据。首先,使用一个初始的搜索查询来获取第一批数据,并设置一个scroll参数来保持查询的状态。然后,通过使用scroll_id来连续地获取后续的批量数据。这种方法适用于数据量较大的情况,可以有效地避免过大的内存占用。 2. 使用Elasticsearch的Snapshot and Restore功能: Elasticsearch提供了Snapshot and Restore功能,可以将整个索引或指定的数据快照到一个或多个快照仓库中。然后,可以将快照存储在本地磁盘或远程存储系统上,并进行导出操作。这种方法适用于需要将整个索引或特定时间范围内的数据导出的场景。 3. 使用Elasticsearch的Export to CSV插件: Elasticsearch有很多第三方的插件可以用于导出数据,其中包括导出到CSV文件的插件。通过安装并配置适当的插件,可以将elasticsearch中的数据导出到CSV文件中。这种方法适用于需要将数据以表格形式导出的场景。 4. 使用Elasticsearch的elasticsearch-dump工具: elasticsearch-dump是一个流行的命令行工具,可以用于导出和导入elasticsearch中的数据。它提供了许多选项来指定要导出的索引、文档类型以及其他导出相关的设置。这种方法适用于需要定制化导出过程的场景。 总结来说,elasticsearch的海量数据导出可以通过使用Scroll API、Snapshot and Restore功能、插件或elasticsearch-dump工具等方法来实现。根据具体的需求和场景选择合适的方法,可以有效地导出elasticsearch中的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值