Elasticsearch Java High Level Client [7.17] 使用

news2025/3/15 1:41:52

es 的 HighLevelClient存在es源代码的引用,结合springboot使用时,会存在es版本的冲突,这里记录下解决冲突和使用方式(es已经不建议使用这个了)。

注意es服务端的版本需要与client的版本对齐,否则返回数据可能会解析失败!!!

文档地址:Java High Level REST Client | Java REST Client [7.17] | Elastic

1、首先创建个java springboot项目

源码地址:https://github.com/a66245753/es-7-high-level-client.git

pom依赖文件如下,在 dependencyManagement 里解决springboot引起的版本冲突-

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.4</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <groupId>com.david</groupId>
  <artifactId>es-7-high-level-client</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>es-7-high-level-client</name>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <elastic.version>7.17.28</elastic.version>
  </properties>
  <dependencyManagement>
    <dependencies>
      <!--规定版本,解决springboot引起的版本冲突-->
      <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-client</artifactId>
        <version>${elastic.version}</version>
      </dependency>
      <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>${elastic.version}</version>
      </dependency>
      <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>${elastic.version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
      <groupId>org.elasticsearch.client</groupId>
      <artifactId>elasticsearch-rest-high-level-client</artifactId>
    </dependency>
    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-boot-starter</artifactId>
      <version>3.4.1</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
    </dependency>
    <!-- Lombok 依赖 -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.22</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
</project>

2、配置es client为java bean

@Configuration
public class EsClientConfig {

    @Bean
    public RestHighLevelClient restHighLevelClient()
    {
        return new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http")
                )
        );
    }
}

2.1 es id查询数据

/**
     * id查询
     *
     * @return
     * @throws IOException
     */
    @PostMapping("/get")
    public ResponseEntity<Object> get() throws IOException {
        GetRequest getRequest = new GetRequest("ssp_ad_union_log_202403");
        getRequest.id("fcBZZZUBJ3krEJ13KbOG");
        GetResponse response = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
        return new ResponseEntity<>(response.getSourceAsMap(), HttpStatus.OK);
    }

2.2 es 多个id查询数据

/**
     * ids查询
     *
     * @return
     * @throws IOException
     */
    @PostMapping("/getBatch")
    public ResponseEntity<Object> getBatch() throws IOException {
        MultiGetRequest multiGetRequest = new MultiGetRequest();
        multiGetRequest.add("ssp_ad_union_log_202403","fcBZZZUBJ3krEJ13KbOG");
        multiGetRequest.add("ssp_ad_union_log_202403","VsBZZZUBJ3krEJ13KbOG");
        MultiGetResponse multiGetItemResponses = restHighLevelClient.multiGet(multiGetRequest, RequestOptions.DEFAULT);
        return new ResponseEntity<>(multiGetItemResponses.getResponses(), HttpStatus.OK);
    }

2.3 search 分页

/**
     * 分页查询
     *
     * @param request
     * @return
     * @throws IOException
     */
    @PostMapping("/search")
    public ResponseEntity<EsSearchResult> search(@RequestBody EsSearchRequest request) throws IOException {
        SearchRequest searchRequest = new SearchRequest(request.getIndex());
        // 构建搜索请求
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.trackTotalHits(true);
        sourceBuilder.from((request.getPageIndex() - 1) * request.getPageSize());
        sourceBuilder.size(request.getPageSize());
        searchRequest.source(sourceBuilder);
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
        if (request.getEqualsParams() != null && !request.getEqualsParams().isEmpty()) {
            for (Map.Entry<String, Object> entry : request.getEqualsParams().entrySet()) {
                queryBuilder.filter(QueryBuilders.termQuery(entry.getKey(), entry.getValue()));
            }
        }
        if (request.getLikeParams() != null && !request.getLikeParams().isEmpty()) {
            for (Map.Entry<String, String> entry : request.getLikeParams().entrySet()) {
                queryBuilder.must(QueryBuilders.matchQuery(entry.getKey(), entry.getValue()));
            }
        }
        if (request.getRangeParams() != null && !request.getRangeParams().isEmpty()) {
            for (EsRangeParams rangeParam : request.getRangeParams()) {
                RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery(rangeParam.getField());
                if (rangeParam.getGte() != null) {
                    rangeQuery.gte(rangeParam.getGte());
                }
                if (rangeParam.getLte() != null) {
                    rangeQuery.lte(rangeParam.getLte());
                }
                queryBuilder.filter(rangeQuery);
            }
        }
        sourceBuilder.query(queryBuilder);
        // 打印查询语句,可以放到kibana中执行并分析性能
        System.out.println(searchRequest.source().toString());
        // 执行搜索
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        EsSearchResult result = new EsSearchResult();
        result.setPageIndex(request.getPageIndex());
        result.setPageSize(request.getPageSize());
        result.setTotal(searchResponse.getHits().getTotalHits().value);
        result.setList(Arrays.stream(searchResponse.getHits().getHits()).map(SearchHit::getSourceAsMap).collect(Collectors.toList()));
        return new ResponseEntity<>(result, HttpStatus.OK);
    }

2.4 aggs 聚合统计

/**
     * 聚合统计
     *
     * @param request
     * @return
     * @throws IOException
     */
    @PostMapping("/aggs")
    public ResponseEntity<List<Object>> aggs(@RequestBody EsSearchRequest request) throws IOException {

        // 创建 SearchSourceBuilder 实例
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        // 设置 track_total_hits
        searchSourceBuilder.trackTotalHits(true);

        // 设置分页参数
        searchSourceBuilder.from(0);
        searchSourceBuilder.size(1);

        // 构建 bool 查询
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
                .filter(QueryBuilders.termQuery("provinceName", "浙江"));

        // 添加查询到 SearchSourceBuilder
        searchSourceBuilder.query(boolQuery);

        // 构建聚合
        TermsAggregationBuilder cityGroup = AggregationBuilders.terms("city_group")
                .field("cityName").size(10)
                .subAggregation(AggregationBuilders.terms("network_group").field("network").size(10))
                .subAggregation(AggregationBuilders.terms("phoneBrand_group").field("phoneBrandName").size(10))
                .subAggregation(AggregationBuilders.terms("sdkVersion_group").field("sdkVersion").size(10))
                .subAggregation(AggregationBuilders.terms("platform_group").field("platformName").size(10))
                .subAggregation(AggregationBuilders.terms("req_group").field("bizType").size(10))
                .subAggregation(
                        AggregationBuilders.filter("ecpm_group", QueryBuilders.termQuery("bizType", 2))
                                .subAggregation(AggregationBuilders.avg("avg_ecpm").field("ecpm"))
                );

        // 添加聚合到 SearchSourceBuilder
        searchSourceBuilder.aggregation(cityGroup);

        // 创建 SearchRequest 并指定索引名称
        SearchRequest searchRequest = new SearchRequest("ssp_ad_union_log_202403");
        searchRequest.source(searchSourceBuilder);

        // 执行搜索请求
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        List<Object> result = new ArrayList<>(searchResponse.getAggregations().asList());
        for (Aggregation aggregation : searchResponse.getAggregations().asList()) {
            String json = aggregation.toString();
//            String json = OBJECT_MAPPER.writeValueAsString(aggregation);
//            Map<String, Object> map = new HashMap<>();
//            BeanUtils.copyProperties(aggregation, map);
            result.add(json);
        }
        return new ResponseEntity<>(result, HttpStatus.OK);
    }

2.5 新增单条数据

/**
     * 通过json新增
     *
     * @return
     * @throws IOException
     */
    @RequestMapping(path = "add")
    public ResponseEntity<IndexResponse> add() throws IOException {
        IndexRequest indexRequest = new IndexRequest("ssp_ad_union_log_202403");
//        indexRequest.id("1234567890");
        indexRequest.opType(DocWriteRequest.OpType.CREATE);


        indexRequest.source("{\n" +
                "          \"id\": 27731976,\n" +
                "          \"reqId\": \"d63e0377-639a-4ac4-96a7-677d507e627e\",\n" +
                "          \"device\": \"android\",\n" +
                "          \"platform\": 3,\n" +
                "          \"platformName\": \"快手\",\n" +
                "          \"clientType\": 1,\n" +
                "          \"myAppId\": \"300001\",\n" +
                "          \"deviceId\": \"d63e0377-639a-4ac4-96a7-677d507e627e\",\n" +
                "          \"adSiteGroupId\": 100000055,\n" +
                "          \"adSiteId\": \"6827003034\",\n" +
                "          \"packagePath\": \"com.jihuomiao.app\",\n" +
                "          \"ecpm\": 10700,\n" +
                "          \"location\": null,\n" +
                "          \"ip\": null,\n" +
                "          \"cityId\": 422800,\n" +
                "          \"areaId\": 422822,\n" +
                "          \"cityName\": \"恩施\",\n" +
                "          \"areaName\": \"建始\",\n" +
                "          \"provinceId\": 420000,\n" +
                "          \"provinceName\": \"湖北\",\n" +
                "          \"phoneBrand\": \"OPPO\",\n" +
                "          \"phoneBrandName\": \"oppo\",\n" +
                "          \"phoneModel\": null,\n" +
                "          \"idfa\": null,\n" +
                "          \"bizType\": 1,\n" +
                "          \"sdkVersion\": \"1.0.2\",\n" +
                "          \"network\": \"5g\",\n" +
                "          \"logTime\": \"2025-03-03 15:31:10\",\n" +
                "          \"createdAt\": \"2025-03-03 15:31:10\"\n" +
                "        }", XContentType.JSON);

        IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);

        return new ResponseEntity<>(indexResponse, HttpStatus.OK);

    }

2.6 bulk 批量新增数据

 @RequestMapping(path = "addBatch")
    public ResponseEntity<BulkResponse> addBatch() throws IOException {

        // 创建 BulkRequest
        BulkRequest bulkRequest = new BulkRequest();
        // 添加多个
        bulkRequest.add(new IndexRequest("ssp_ad_union_log_202403")
//                .id("12345678909")
                .source("{ \"field1\": \"value1\", \"field2\": \"value2\" }", XContentType.JSON));

        bulkRequest.add(new IndexRequest("my_index")
//                .id("12345678987654")
                .source("{ \"field1\": \"value2\", \"field2\": \"value2\" }", XContentType.JSON));

        // 执行批量创建操作
        BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        // 检查是否有错误
        if (bulkResponse.hasFailures()) {
            System.err.println("Bulk operation had failures: " + bulkResponse.buildFailureMessage());
        } else {
            System.out.println("All documents created successfully.");
        }
        return new ResponseEntity<>(bulkResponse, HttpStatus.OK);
    }

es 7 high Level client 主要的集成问题还是在与springboot的版本冲突,这点解决掉就可以了,官方文档里都能找到使用说明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2315171.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue项目搜索引擎优化(SEO)终极指南:从原理到实战

文章目录 1. SEO基础与Vue项目的挑战1.1 为什么Vue项目需要特殊SEO处理&#xff1f;1.2 搜索引擎爬虫工作原理 2. 服务端渲染&#xff08;SSR&#xff09;解决方案2.1 Nuxt.js框架实战原理代码实现流程图 2.2 自定义SSR实现 3. 静态站点生成&#xff08;SSG&#xff09;技术3.1…

【性能测试】Jmeter下载安装、环境配置-小白使用手册(1)

本篇文章主要包含Jmeter的下载安装、环境配置 添加线程组、结果树、HTTP请求、请求头设置。JSON提取器的使用&#xff0c;用户自定义变量 目录 一&#xff1a;引入 1&#xff1a;软件介绍 2&#xff1a;工作原理 3&#xff1a;安装Jmeter 4&#xff1a;启动方式 &#xf…

【Matlab仿真】如何解决三相交流信号源输出波形失真问题?

问题描述 如标题所示&#xff0c;在搭建simulink模型过程中&#xff0c;明明模型搭建的没有问题&#xff0c;但是输出的波形却不是理想的正弦波&#xff0c;影响问题分析。 问题分析 以三相交流信号源输出波形为例&#xff0c;输出信号理应为三相正弦量&#xff0c;但是仿真…

Fiora聊天系统本地化部署:Docker搭建与远程在线聊天的实践指南

文章目录 前言1.关于Fiora2.安装Docker3.本地部署Fiora4.使用Fiora5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 这个通讯软件泛滥的时代&#xff0c;每天都在刷着同样的朋友圈、看着千篇一律的表情包&#xff0c;是不是觉得有点腻了&#…

metersphere接口测试(1)使用MeterSphere进行接口测试

文章目录 前言接口文档单接口测试环境配置梳理接口测试场景测试接口 接口自动化怎么写复用性高的自动化测试用例 总结 前言 大汉堡工作第203天&#xff0c;本篇记录我第一次接触接口测试任务&#xff0c;最近有些懈怠啊~ 接口文档 首先就是接口地址&#xff0c;接口测试时用…

【实战ES】实战 Elasticsearch:快速上手与深度实践-8.2.2成本优化与冷热数据分离

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 8.2.2AWS OpenSearch Serverless 成本优化与冷热数据分离深度实践1. 成本构成分析与优化机会识别1.1 Serverless模式成本分布1.2 冷热数据特征分析数据特征矩阵 2. 冷热数据…

MTK Android12 安装app添加密码锁限制

提示&#xff1a;通过安装前输入密码的需求&#xff0c;来熟悉了解PMS 基本的安装流程 文章目录 一、需求实现需求原因提醒 二、UML图-类图三、参考资料四、实现效果五、需求修改点修改文件及路径具体修改内容 六、源码流程分析PMS的复杂性代码量实现aidl 接口PackageManagerSe…

[数据结构]堆详解

目录 一、堆的概念及结构 二、堆的实现 1.堆的定义 2堆的初始化 3堆的插入 ​编辑 4.堆的删除 5堆的其他操作 6代码合集 三、堆的应用 &#xff08;一&#xff09;堆排序&#xff08;重点&#xff09; &#xff08;二&#xff09;TOP-K问题 一、堆的概念及结构 堆的…

LInux中常用的网络命令

配置 IP 地址 1.1 配置 IP 地址 IP 地址是计算机在互联网中唯一的地址编码。每台计算机如果需要接入网络和其他计算机进行数据通信&#xff0c;就必须配置唯一的公网 IP 地址。 配置 IP 地址有两种方法&#xff1a; 1&#xff09;setup 工具 2&#xff09;vi /etc/sysconf…

怎么实现: 大语言模型微调案例

怎么实现: 大语言模型微调案例 目录 怎么实现: 大语言模型微调案例输入一个反常识的问题:首都在北京天安门之后对输出模型进行测试:首都在北京天安门微调代码:测试微调模型代码:微调输出模型结构输出模型参数大小对比Qwen 2.5_0.5:53MB输出模型:951MB 是一样的,没有进行…

深入理解 MySQL 锁:基于 InnoDB 的并发控制解析

在数据库并发访问管理中&#xff0c;MySQL 提供了强大的锁机制来保证数据的一致性和完整性。作为默认存储引擎的 InnoDB&#xff0c;为 MySQL 带来了细粒度的锁控制&#xff0c;使其成为高并发应用的理想选择。本文将深入探讨 MySQL 的锁类型、分类、应用场景及其对性能的影响&…

Linux Nginx安装部署、注册服务

1、下载&#xff1a;https://nginx.org/en/download.html 下载nginx-1.27.4.tar.gz&#xff0c;上传到服务器 /opt/目录 在开始安装Nginx之前&#xff0c;首先需要安装一些依赖项&#xff0c;以确保Nginx编译和运行正常。打开终端并执行以下命令&#xff1a; yum install -y …

安全的实现数据备份和恢复

&#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》&#xff08;基础篇&#xff09;、&#xff08;进阶篇&#xff09;、&#xff08;架构篇&#xff09;清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、…

excel中两个表格的合并

使用函数&#xff1a; VLOOKUP函数 如果涉及在excel中两个工作表之间进行配对合并&#xff0c;则&#xff1a; VLOOKUP(C1,工作表名字!A:B,2,0) 参考&#xff1a; excel表格中vlookup函数的使用方法步骤https://haokan.baidu.com/v?pdwisenatural&vid132733503560775…

在 Windows 上快速部署 OpenManus:从安装到运行

在当今快速发展的 AI 领域&#xff0c;OpenManus 作为一个强大的开源工具&#xff0c;为开发者提供了便捷的 AI 应用开发体验。本文将详细介绍如何在 Windows 系统上安装并运行 OpenManus&#xff0c;帮助你快速搭建一个本地的 AI 开发环境。 一、安装 Anaconda Anaconda 是一…

uniapp实现 uview1 u-button的水波纹效果

说明&#xff1a; 由于uview2已经移除水波纹效果&#xff0c;这边又觉得那个效果好看&#xff0c;所以开发这个功能(原谅我不会录动图) 效果&#xff1a; 具体代码&#xff1a; <view class"ripple-container" touchstart"handleTouchStart" touchend&…

如何使用Cursor的claude-3.7模型来开发高保真的原型设计图,学会写好的提示词人人都是设计师

1、想要开发出高保真的设计图原型&#xff0c;需要给出cursor具体的提示词&#xff1a;比如我想开发一款IT面试题小程序&#xff0c;给出的提示词是这样的 我想开发一个 {IT面试题库小程序}&#xff0c;现在需要输出高保真的原型图&#xff0c;请通过以下方式帮我完成所有界面…

AGI大模型(5):提示词工程

1 什么是提示词工程&#xff08;Prompt&#xff09; 所谓的提示词其实指的就是提供给模型的⼀个⽂本⽚段&#xff0c;⽤于指导模型⽣成特定的输出或回答。提示词的⽬的是为模型提供⼀个任务的上下⽂&#xff0c;以便模型能够更准确地理解⽤户的意图&#xff0c;并⽣成相关的回…

[LeetCode热门100题]|137,260,268,面试17.19

1、137 只出现一次数字|| 1、题目描述 137 只出现一次数字||https://leetcode.cn/problems/single-number-ii/description/ 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你…

Android子线程更新View的方法原理

对于所有的Android开发者来说&#xff0c;“View的更新必须在UI线程中进行”是一项最基本常识。 如果不在UI线程中更新View&#xff0c;系统会抛出CalledFromWrongThreadException异常。那么有没有什么办法可以不在UI线程中更新View&#xff1f;答案当然是有的&#xff01; 一…