ElasticSearch工具类 - ESUtils

1、引入依赖

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.15.0</version>
</dependency>

2、es配置

java 复制代码
spring:
  data:
    elasticsearch:
      cluster-nodes: localhost:9200

3、创建ESUtils工具类

java 复制代码
import org.elasticsearch.action.search.ClearScrollRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchScrollRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Component
public class ESUtils {
    @Resource
    private RestHighLevelClient elasticsearchClient;

    /**
     * 滚动查询全部数据
     * @param indexName 查询的索引 - 数据库
     */
    public List<String> queryDataInRange(String indexName, SearchSourceBuilder sourceBuilder) {
        List<String> results = new ArrayList<>();
        String scrollId = null;
        try {
            SearchRequest searchRequest = new SearchRequest(indexName)
                    .source(sourceBuilder)
                    .scroll(TimeValue.timeValueMinutes(1));

            // 执行搜索请求,获取第一批数据和 scrollId
            SearchResponse searchResponse = elasticsearchClient.search(searchRequest, RequestOptions.DEFAULT);
            scrollId = searchResponse.getScrollId();
            SearchHit[] searchHits = searchResponse.getHits().getHits();

            // 处理第一批数据
            results.addAll(processHits(searchHits));

            // 滚动查询处理后续的数据
            while (searchHits != null && searchHits.length > 0) {
                SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId)
                        .scroll(TimeValue.timeValueMinutes(1));
                // 滚动查询
                searchResponse = elasticsearchClient.scroll(scrollRequest, RequestOptions.DEFAULT);
                scrollId = searchResponse.getScrollId();
                searchHits = searchResponse.getHits().getHits();

                // 处理后续数据
                results.addAll(processHits(searchHits));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 清除 scroll 上下文
            if (scrollId != null) {
                ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
                clearScrollRequest.addScrollId(scrollId);
                try {
                    elasticsearchClient.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return results;
    }

    // 处理查询到的数据
    private List<String> processHits(SearchHit[] searchHits) {
        List<String> results = new ArrayList<>();
        for (SearchHit hit : searchHits) {
            results.add(hit.getSourceAsString());
        }
        return results;
    }

}

4、测试工具类

java 复制代码
import com.example.es.utils.ESUtils;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.util.List;

@SpringBootTest
class EsDemoApplicationTests {
    @Resource
    private ESUtils esUtils;

    @Test
    void contextLoads() {
        // 构造初始的搜索请求
        RangeQueryBuilder queryBuilder = QueryBuilders
                .rangeQuery("timeField")
                .gte("2024-03-18 00:00:00")
                .lte("2024-03-18 23:59:59");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
                .query(queryBuilder)
                .sort("timeField", SortOrder.ASC)
                .size(1000);
        List<String> resultMap = esUtils.queryDataInRange("index-Bank", sourceBuilder);
        resultMap.forEach(System.out::println);
    }

}
相关推荐
凯禾瑞华养老实训室39 分钟前
智慧养老实训室建设指南:厂家的产品选型与应用建议
大数据·人工智能·ar·vr·虚拟仿真·智慧健康养老服务与管理
德昂信息dataondemand1 小时前
开好经营月会:如何把数据变成决策的利器?
大数据·人工智能·abi·经营月会
ajax_beijing1 小时前
hadoop的三副本数据冗余策略
大数据·hadoop·分布式
失散132 小时前
分布式专题——46 ElasticSearch高级查询语法Query DSL实战
java·分布式·elasticsearch·架构
Elasticsearch2 小时前
Elasticsearch 推理 API 增加了开放的可定制服务
elasticsearch
萤丰信息2 小时前
智慧园区:引领城市未来发展新趋势
大数据·科技·安全·重构·智慧城市·智慧园区
千桐科技3 小时前
qData 数据中台:全面支持 ARM 架构与信创国产化环境的兼容性说明
大数据·数据可视化
武子康4 小时前
大数据-127 - Flink StateBackend详解:Memory、Fs、RocksDB 与 OperatorState 管理机制与重分配原理
大数据·后端·flink
中电金信4 小时前
中电金信:从AI赋能到AI原生——企业级工具链平台重塑与建设实践
大数据
一张假钞4 小时前
Windows下Jenkins服务未自动重启问题解决
jenkins