当前位置: 首页 > news >正文

Springboot 整合Elasticsearch

1 java操作ES方式

1.1 操作ES 9300端口(TCP) 但开发中不在9300进行操作
ES集群节点通信使用的也是9300端口如果通过9300操作ES,需要与ES建立长连接  可通过引入spring-data-elasticsearch:transport-api.jar不在9300操作原因:1.springboot版本不同,transport-api.jar不同,不能适配ES版本2.官方在7.x版本已经不建议在9300操作ES,8以后会废弃ES通过9300操作的jar包
1.2 操作ES 9200端口(HTTP) 优选Elasticsearch-Rest-Client
通过9200对ES发送Http请求就可以了
1.使用第三方JestClient操作ES:更新慢
2.RestTemplate、HttpClient、OkHttp:发送HTTP请求,但如果操作ES一些DSL语句,需要自己封装,麻烦
3.Elasticsearch-Rest-Client(elasticsearch-rest-high-level-client):官方RestClient,封装了ES操作,API层次分明,上手简单

2 整合

2.1引入elasticsearch-rest-high-level-client依赖
<!--elasticsearch-->
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.4.2</version>
</dependency>
刷新Maven 会发现elasticsearch和elasticsearch-rest-client版本是7.17.4,并不是7.4.2

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

原因是因为springboot对ES版本做了管理,当前springboot默认整合spring-data-elasticsearch操作ES
修改版本问题
如果使用Maven进行一个直接或间接继承spring-boot-dependencies(比如spring-boot-starter-parent)的构建,并想覆盖一个特定的
第三方依赖版本,可以添加<properties>标签,并重写第三方依赖版本
<properties><elasticsearch.version>7.4.2</elasticsearch.version>
</properties>
如果使用<scope>import</scope>,将spring-boot-dependencies添加到自己的dependencyManagement片段,
那么必须重新定义artifact而不是重写第三方依赖版本
<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.7.3</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.4.2</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>7.4.2</version></dependency></dependencies>
</dependencyManagement>
2.2 添加ES配置
@Configuration
public class ElasticsearchConfig {/*** 配置请求选项* 参考:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.4/java-rest-low-usage-requests.html#java-rest-low-usage-request-options*/public static final RequestOptions COMMON_OPTIONS;static {RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();// builder.addHeader("Authorization", "Bearer " + TOKEN);// builder.setHttpAsyncResponseConsumerFactory(//         new HttpAsyncResponseConsumerFactory//                 .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));COMMON_OPTIONS = builder.build();}@Beanpublic RestHighLevelClient esRestClient() {
//        RestHighLevelClient highLevelClient = new RestHighLevelClient(RestClient.builder(new HttpHost("192.168.179.101", 9200, "Http"),
//                new HttpHost("192.168.179.101", 9201, "Http")));RestHighLevelClient highLevelClient = new RestHighLevelClient(RestClient.builder(new HttpHost("192.168.179.101", 9200, "Http")));return highLevelClient;}}
2.3 测试及验证整合结果
@SpringBootTest
public class SearchApplicationTests {@Autowiredprivate RestHighLevelClient client;@Data@ToStringstatic class Account {private int account_number;private int balance;private String firstname;private String lastname;private int age;private String gender;private String address;private String employer;private String email;private String city;private String state;}/*** 在new_bank中搜索address中包含mill的所有人的年龄分布以及平均薪资*/@Testpublic void searchData() throws IOException {//1,创建检索请求SearchRequest searchRequest = new SearchRequest();//1.1,指定检索索引searchRequest.indices("new_bank");//1.2,构造检索条件SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.matchQuery("address", "Mill"));//1.2.1,按照年龄分布进行聚合TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);searchSourceBuilder.aggregation(ageAgg);//1.2.2,计算平均薪资AvgAggregationBuilder avgBalance = AggregationBuilders.avg("avgBalance").field("balance");searchSourceBuilder.aggregation(avgBalance);System.out.println("检索条件" + searchSourceBuilder);searchRequest.source(searchSourceBuilder);//2,执行同步检索SearchResponse searchResponse = client.search(searchRequest, ElasticsearchConfig.COMMON_OPTIONS);System.out.println("执行检索结果" + searchResponse);//3,提取命中结果hitsSearchHits hits = searchResponse.getHits();SearchHit[] hitsHits = hits.getHits();for (SearchHit hitsHit : hitsHits) {String sourceAsString = hitsHit.getSourceAsString();Account account = JSONObject.parseObject(sourceAsString, Account.class);System.out.println(account);}//4,提取聚合信息Aggregations aggregations = searchResponse.getAggregations();Terms ageAggRes = aggregations.get("ageAgg");List<? extends Terms.Bucket> aggResBuckets = ageAggRes.getBuckets();for (Terms.Bucket aggResBucket : aggResBuckets) {System.out.println("年龄:" + aggResBucket.getKeyAsString() + "总和:" + aggResBucket.getDocCount());}Avg balance = aggregations.get("avgBalance");System.out.println(balance.getValue());}/*** https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.4/java-rest-high-document-index.html*/@Testpublic void testEsAdd() throws IOException {//指定索引IndexRequest indexRequest = new IndexRequest("users");//指定idindexRequest.id("1");//封装数据User user = new User();user.setUserName("张三");user.setAge(27);user.setGender("M");String jsonString = JSONObject.toJSONString(user);//指定数据类型为JSONindexRequest.source(jsonString, XContentType.JSON);//执行同步操作IndexResponse index = client.index(indexRequest, ElasticsearchConfig.COMMON_OPTIONS);System.out.println(index);}@Dataclass User {private String userName;private String gender;private Integer age;}}
kibanaGET /users/_search
{"took" : 1,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "users","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"age" : 27,"gender" : "M","userName" : "张三"}}]}
}

相关文章:

Springboot 整合Elasticsearch

1 java操作ES方式 1.1 操作ES 9300端口(TCP) 但开发中不在9300进行操作 ES集群节点通信使用的也是9300端口如果通过9300操作ES&#xff0c;需要与ES建立长连接 可通过引入spring-data-elasticsearch:transport-api.jar不在9300操作原因&#xff1a;1.springboot版本不同&…...

WeNet环境配置与aishell模型训练

WeNet环境配置与aishell模型训练 1环境配置 踩坑记录&#xff1a; 系统使用win11&#xff0c;我根据wenet官方文档&#xff0c;使用conda虚拟环境安装了cuda12.1&#xff0c;安装wenet依赖库&#xff0c;其中deepspeed报错&#xff0c;根据报错信息查询github&#xff0c;发现…...

【C++的剃刀】我不允许你还不会AVL树

​ 学习编程就得循环渐进&#xff0c;扎实基础&#xff0c;勿在浮沙筑高台 循环渐进Forward-CSDN博客 Hello,这里是kiki&#xff0c;今天继续更新C部分&#xff0c;我们继续来扩充我们的知识面&#xff0c;我希望能努力把抽象繁多的知识讲的生动又通俗易懂&#xff0c;今天要…...

React搭建Vite项目及各种项目配置

1. 创建Vite项目 在操作系统的命令终端&#xff0c;输入以下命令&#xff1a; yarn create vite 输入完成以后输入项目名称、选择开发框架&#xff0c;选择开发语言&#xff0c;如下图所示&#xff0c;即可完成项目创建。 注意事项&#xff1a; 1. Node版本必须符合要求&…...

Linux Vim教程:多文件编辑与窗口管理

目录 1. 多文件编辑基础 1.1 缓冲区管理 1.2 标签页管理 1.3 分屏管理 2. 多文件编辑的高级技巧 2.1 同时编辑多个文件 2.2 使用会话 2.3 使用寄存器 3. 窗口管理的实用技巧 3.1 窗口调整 3.2 窗口排列 3.3 快速切换 4. 使用插件增强多文件编辑与窗口管理 4.1 NE…...

C语言进阶 11.结构体

C语言进阶 11.结构体 文章目录 C语言进阶 11.结构体11.1. 枚举11.2. 结构类型11.3. 结构与函数11.4. 结构中的结构11.5. 类型定义11.6. 联合11.7. PAT11-0. 平面向量加法(10)11-1. 通讯录的录入与显示(10) 11.1. 枚举 常量符号化: 用符号而不是具体的数字表示程序中的数字 cons…...

Vue--解决error:0308010C:digital envelope routines::unsupported

原文网址&#xff1a;Vue--解决error:0308010C:digital envelope routines::unsupported_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何解决node.js在运行Vue项目时的报错&#xff1a;error:0308010C:digital envelope routines::unsupported。 问题描述 使用node.js运行Vu…...

go-kratos 学习笔记(6) 数据库gorm使用

数据库是项目的核心&#xff0c;数据库的链接数据是data层的操作&#xff0c;选择了比较简单好用的gorm作为数据库的工具&#xff1b;之前是PHP开发&#xff0c;各种框架都是orm的操作&#xff1b;gorm还是很相似的&#xff0c;使用起来比较顺手 go-kratos官网的实例是ent&…...

记录:vite打包报错 error during build: Error: Parse error @:1:1

vant从3升级到4后&#xff0c;本地运行没问题&#xff0c; 但是打包就会报如下错误&#xff1a;error during build: Error: Parse error :1:1 一直以为是vant的问题&#xff0c;各种升级&#xff0c;替换插件&#xff0c;发现没什么用&#xff0c; 网上搜索了下&#xff0c;…...

Python 消费Kafka手动提交 批量存入Elasticsearch

一、第三方包选择 pip install kafka&#xff0c;对比了kafka和pykafka&#xff0c;还是选择kafka&#xff0c;消费速度更快pip install elasticsearch7.12.0(ES版本) 二、创建es连接对象 from elasticsearch import Elasticsearch from elasticsearch.helpers import bulkc…...

oracle 基础知识表的主键

一、表的约束条件 •约束条件是施加在表的字段上的一组限制条件&#xff0c;它使得只有符合限制条件要求的数据才能输入表。 •保证了表中的数据的正确性 i.约束条件包括了&#xff1a;非空和唯一和核对&#xff0c;即not null 和unique 和check null的含义:不确定 3个人去捡苹…...

opencascade AIS_MouseGesture AIS_MultipleConnectedInteractive源码学习

AIS_MouseGesture //! 鼠标手势 - 同一时刻只能激活一个。 enum AIS_MouseGesture { AIS_MouseGesture_NONE, //!< 无激活手势 // AIS_MouseGesture_SelectRectangle, //!< 矩形选择&#xff1b; //! 按下按钮开始&#xff0c;移动鼠标定义矩形&…...

Unity Apple Vision Pro 开发:如何把 PolySpatial 和 Play To Device 的版本从 1.2.3 升级为 1.3.1

XR 开发社区&#xff1a; SpatialXR社区&#xff1a;完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 &#x1f4d5;教程说明 本教程将介绍如何把 Unity 的 PolySpatial 和 Play To Device 版本从 1.2.3 升级为 1.3.1。 &#x1f4d5;Play To Device 软件升级 ht…...

大数据时代,区块链是如何助力数据开放共享的?

在大数据时代&#xff0c;区块链技术以其独特的优势&#xff0c;为数据开放共享提供了强有力的支持。以下是区块链助力数据开放共享的几个主要方面&#xff1a; 1. 增强数据安全性与隐私保护 加密安全&#xff1a;区块链技术采用先进的加密算法&#xff0c;如国密非对称加密技…...

睿抗2024省赛----RC-u4 章鱼图的判断

题目 对于无向图 G(V,E)&#xff0c;我们将有且只有一个环的、大于 2 个顶点的无向连通图称之为章鱼图&#xff0c;因为其形状像是一个环&#xff08;身体&#xff09;带着若干个树&#xff08;触手&#xff09;&#xff0c;故得名。 给定一个无向图&#xff0c;请你判断是不…...

py2exe,一个神奇的 Python 库

在众多Python打包工具中&#xff0c;py2exe无疑是一款出色的选择。它能够将Python脚本转换成可在Windows平台上独立运行的可执行文件&#xff0c;极大地方便了程序的分发与部署。本文将深入探讨py2exe的特性和使用方法&#xff0c;让你在创建桌面应用程序时更加游刃有余。 安装…...

博途PLC网络连接不上

博途PLC网络连接不上其中的一个原因就是网线接触不好&#xff0c;各种原因都试了&#xff0c;任然连接不上&#xff0c;大家可以把网线拔下&#xff0c;重新插拔或者直接更换一根网线。 1、无线网络网段和PLC连接网段冲突 。。。。...

哪个邮箱最安全最好用啊

企业邮箱安全至关重要&#xff0c;需保护隐私、防财务损失、维护通信安全、避免纠纷&#xff0c;并维持业务连续性。哪个企业邮箱最安全好用呢&#xff1f;Zoho企业邮箱&#xff0c;采用加密技术、反垃圾邮件和病毒保护&#xff0c;支持多因素认证&#xff0c;确保数据安全合规…...

企业微信开发智能升级:AIGC技术赋能,打造高效沟通平台

文章目录 一、AIGC在企业微信开发中的核心价值1. 智能化客服体验2. 自动化工作流程3. 个性化内容推荐4. 深度数据分析与洞察 二、使用AIGC进行企业微信开发的实践路径1. 需求分析与场景定义2. 技术选型与平台搭建3. 模型训练与调优4. 接口对接与功能集成5. 测试与优化 《企业微…...

Apache Doris + Paimon 快速搭建指南|Lakehouse 使用手册(二)

湖仓一体&#xff08;Data Lakehouse&#xff09;融合了数据仓库的高性能、实时性以及数据湖的低成本、灵活性等优势&#xff0c;帮助用户更加便捷地满足各种数据处理分析的需求。在过去多个版本中&#xff0c;Apache Doris 持续加深与数据湖的融合&#xff0c;已演进出一套成熟…...

OpenClaw数据标注:用Qwen3-VL:30B增强飞书图像训练集

OpenClaw数据标注&#xff1a;用Qwen3-VL:30B增强飞书图像训练集 1. 为什么需要自动化数据标注 作为一个小型AI团队的算法工程师&#xff0c;我最近遇到了一个典型的数据瓶颈问题&#xff1a;我们需要为垂直领域的图像识别任务构建训练集&#xff0c;但手动标注上千张飞书聊天…...

学术研究助手:OpenClaw+nanobot自动抓取论文与生成综述

学术研究助手&#xff1a;OpenClawnanobot自动抓取论文与生成综述 1. 为什么需要自动化文献处理 作为一名经常需要追踪前沿研究的科研人员&#xff0c;我发现自己每周要花至少8小时在arXiv上筛选论文、阅读摘要、整理笔记。最痛苦的是&#xff0c;当我需要撰写某领域的综述时…...

从理论到实践:双有源桥DAB-SPS控制模式仿真全解析

1. 双有源桥DAB与SPS控制模式入门 第一次接触双有源桥&#xff08;Dual Active Bridge&#xff0c;简称DAB&#xff09;时&#xff0c;我被它优雅的对称结构吸引住了。这种DC-DC变换器拓扑就像一座精心设计的桥梁&#xff0c;两侧各有一个全桥电路&#xff0c;通过高频变压器耦…...

程序员转行学习 AI 大模型: 踩坑记录:服务器内存不够,程序被killed

本文是程序员转行学习AI大模型的踩坑记录分享。 当前阶段&#xff1a;还在学习知识点&#xff0c;由点及面&#xff0c;从 0 到 1 搭建 AI 大模型知识体系中。 系列更新&#xff0c;关注我&#xff0c;后续会持续记录分享转行经历&#xff5e; 踩坑问题 我是在阿里云上购买了一…...

AnalogPin库:Arduino模拟信号抗噪与平滑处理实战指南

1. AnalogPin 库概述&#xff1a;面向嵌入式系统的模拟信号抗噪与平滑处理框架AnalogPin 是一个专为 Arduino 平台设计的轻量级 C 类库&#xff0c;其核心目标并非简单封装analogRead()&#xff0c;而是构建一套可配置、可扩展、硬件感知的模拟输入信号调理机制。在工业传感、电…...

LVGL实战:用外部按键(Keypad)和旋转编码器(Encoder)在无触摸屏设备上实现流畅UI交互

LVGL物理交互实战&#xff1a;用按键与编码器打造无触摸屏的流畅UI控制 在智能家居控制面板、工业HMI设备等场景中&#xff0c;物理按键和旋转编码器因其可靠性和低成本优势&#xff0c;成为触摸屏的理想替代方案。本文将深入探讨如何通过LVGL的输入设备子系统&#xff0c;实现…...

Pikachu文件包含漏洞的花式玩法:从源码读取到蚁剑GetShell全记录

Pikachu文件包含漏洞的深度利用&#xff1a;从源码审计到权限维持实战 在网络安全领域&#xff0c;文件包含漏洞一直是渗透测试中的"黄金门票"。不同于简单的SQL注入或XSS攻击&#xff0c;文件包含漏洞往往能带来更直接的服务器控制权。本文将带你深入Pikachu靶场&am…...

Python AI用例生成全链路实践(含12个工业级代码片段+GPT-4/Claude/Llama3对比基准)

第一章&#xff1a;Python AI用例生成全链路实践概览AI用例生成是将业务需求快速转化为可执行AI解决方案的关键环节&#xff0c;涵盖从问题定义、数据准备、模型选型、提示工程、评估验证到部署集成的完整闭环。本章聚焦基于Python生态的端到端实践路径&#xff0c;强调可复现性…...

SDXL-Turbo多场景落地教程:覆盖电商、游戏、教育、自媒体的6大用法

SDXL-Turbo多场景落地教程&#xff1a;覆盖电商、游戏、教育、自媒体的6大用法 1. 认识SDXL-Turbo&#xff1a;重新定义AI绘画体验 SDXL-Turbo不是传统的AI绘画工具&#xff0c;而是一个革命性的实时创作伙伴。想象一下&#xff0c;你打字的同时&#xff0c;画面就在眼前实时…...

码农专用,轻松拥有小金库

作为天天和代码、BUG、项目进度死磕的程序员&#xff0c;咱们这辈子靠理性思维、逻辑推演解决了无数技术难题&#xff0c;可一碰到理财这件事&#xff0c;几乎全员踩坑&#xff1a;要么没时间研究&#xff0c;要么怕风险不敢下手&#xff0c;最后只能把辛苦攒下的工资、年终奖丢…...