【ElasticSearch系列-05】SpringBoot整合elasticSearch

ElasticSearch系列整体栏目


内容链接地址
【一】ElasticSearch下载和安装https://zhenghuisheng.blog.csdn.net/article/details/129260827
【二】ElasticSearch概念和基本操作https://blog.csdn.net/zhenghuishengq/article/details/134121631
【三】ElasticSearch的高级查询Query DSLhttps://blog.csdn.net/zhenghuishengq/article/details/134159587
【四】ElasticSearch的聚合查询操作https://blog.csdn.net/zhenghuishengq/article/details/134159587
【五】SpringBoot整合elasticSearchhttps://blog.csdn.net/zhenghuishengq/article/details/134212200

SpringBoot整合elasticSearch

  • 一,SpringBoot整合ElasticSearch
    • 1,需要的依赖以及版本
    • 2,创建config配置类并测试连接
    • 3,增删改查测试
      • 3.1,索引插入数据
      • 3.2,根据id查询数据
      • 3.3,删除一条数据
    • 4,普通查询
      • 4.1,match条件查询
      • 4.2,term精确匹配
      • 4.3,prefix前缀查询
      • 4.4,通配符查询wildcard
      • 4.5,范围查询
      • 4.6,fuzzy模糊查询
      • 4.7,highlight高亮查询
    • 5,聚合查询
      • 5.1,aggs聚合查询
      • 5.2,获取最终结果

一,SpringBoot整合ElasticSearch

前面几篇讲解了es的安装,dsl语法,聚合查询等,接下来这篇主要就是讲解通过java的方式来操作es,这里选择通过springboot的方式整合ElasticSearchSearch

在学习这个整合之前,可以查看对应的官网资料:https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/7.17/connecting.html

1,需要的依赖以及版本

首先创建springboot项目,然后需要的依赖如下,我前面用的是7.7.0的版本,因此这里继续使用这个版本。其他的依赖根据个人需要选择

<properties><java.version>8</java.version><elasticsearch.version>7.7.0</elasticsearch.version>
</properties>
<dependencies><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.7.0</version></dependency>
</dependencies>

2,创建config配置类并测试连接

随后创建一个config的配置类,用于连接上ElasticSearch,我这边是单机版,并没有集群

/*** 连接es的工具类*/
@Configuration
public class ElasticSearchConfig { public static final RequestOptions COMMON_OPTIONS;static {RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();COMMON_OPTIONS = builder.build();}@Beanpublic RestHighLevelClient esRestClient(){RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("xx.xx.xx.xx", 9200, "http")));return  client;}
}

在创建好了之后,可以直接在test类中进行测试,看能否连接成功

@RunWith(SpringRunner.class)
@SpringBootTest
public class StudyApplicationTests {@Resourceprivate RestHighLevelClient client;@Testpublic void contextLoads() {System.out.println(restHighLevelClient);}
}

在运行之后,如果打印出了以下这句话,表示整合成功

org.elasticsearch.client.RestHighLevelClient@7d151a

3,增删改查测试

3.1,索引插入数据

首先先创建一个users的索引,并向里面插入一条数据。插入和更新都可以用这个方法

//创建一个user索引,并且插入一条数据
@Test
public void addData() throws IOException {//创建一个索引IndexRequest userIndex = new IndexRequest("users");User user = new User();user.setId(1);user.setUsername("Tom");user.setPassword("123456");user.setAge(18);user.setSex("女");//添加数据userIndex.source(JSON.toJSONString(user), XContentType.JSON);IndexResponse response = client.index(userIndex, ElasticSearchConfig.COMMON_OPTIONS);//响应数据System.out.println(response);
}

随后再在kibana中查询这个索引,可以看到这条数据是已经插入成功的,并且索引页创建成功

在这里插入图片描述

3.2,根据id查询数据

查询id为1的数据,需要通过QueryBuild构造器查询

@Test
public void getById() throws IOException {SearchRequest request = new SearchRequest("users");SearchSourceBuilder builder = new SearchSourceBuilder();builder.query(QueryBuilders.matchQuery("id", "1"));request.source(builder);SearchResponse response = client.search(request, RequestOptions.DEFAULT);System.out.println(response);
}

3.3,删除一条数据

删除刚刚创建的这条数据,这里直接设置id为1即可

@Test
public void deleteById() throws Exception{DeleteRequest request = new DeleteRequest("users");request.id("1");DeleteResponse delete = client.delete(request, ElasticSearchConfig.COMMON_OPTIONS);System.out.println(delete);
}

4,普通查询

这里主要是结合本人写的第三篇Query DSL的语法,通过java的方式写出依旧是先创建一个员工的信息索引,并且设置字段得我属性

PUT /employees
{"mappings": {"properties": {"name":{"type": "keyword"},"job":{"type": "keyword"},"salary":{"type": "integer"}}}
}

随后批量的插入10条数据

PUT /employees/_bulk
{ "index" : {  "_id" : "1" } }
{ "name" : "huisheng1","job":"python","salary":35000 }
{ "index" : {  "_id" : "2" } }
{ "name" : "huisheng2","job":"java","salary": 50000}
{ "index" : {  "_id" : "3" } }
{ "name" : "huisheng3","job":"python","salary":18000 }
{ "index" : {  "_id" : "4" } }
{ "name" : "huisheng4","job":"java","salary": 22000}
{ "index" : {  "_id" : "5" } }
{ "name" : "huisheng5","job":"javascript","salary":18000 }
{ "index" : {  "_id" : "6" } }
{ "name" : "huisheng6","job":"javascript","salary": 25000}
{ "index" : {  "_id" : "7" } }
{ "name" : "huisheng7","job":"c++","salary":20000 }
{ "index" : {  "_id" : "8" } }
{ "name" : "huisheng8","job":"c++","salary": 20000}
{ "index" : {  "_id" : "9" } }
{ "name" : "huisheng9","job":"java","salary":22000 }
{ "index" : {  "_id" : "10" } }
{ "name" : "huisheng10","job":"java","salary": 9000}

4.1,match条件查询

首先是分页查询,分页查询的queryDSL的语法如下

GET /employees/_search
{"query": {"match": {"job": "java"}}
}

java的语法如下

SearchRequest request = new SearchRequest("employees");
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.matchQuery("job", "java"));
request.source(builder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
System.out.println(response);

短语匹配的语法如下

builder.query(QueryBuilders.matchPhraseQuery("job","java"));

多字段查询的语法如下

String fields[] = {"job","name"};
builder.query(QueryBuilders.multiMatchQuery("java",fields));

queryString的语法如下

builder.query(QueryBuilders.queryStringQuery("java"));

4.2,term精确匹配

GET /employees/_search
{"query": {"term": {"job": "java"}}
}

精确匹配通过java的方式如下

builder.query(QueryBuilders.termQuery("job","java"));

4.3,prefix前缀查询

PUT /employees/_search
{"query":{"prefix":{"name":{"value":"huisheng1"}}}
}

前缀查询的java方式如下

builder.query(QueryBuilders.prefixQuery("name","huisheng1"));

4.4,通配符查询wildcard

GET /employees/_search
{"query": {"wildcard": {"job": {"value": "*py*"}}}
}

通配符查询的java方式如下

builder.query(QueryBuilders.wildcardQuery("job","py"));

4.5,范围查询

POST /employees/_search
{"query": {"range": {"salary": {"gte": 25000}}}
}

范围查询的java方式如下

builder.query(QueryBuilders.rangeQuery("salary").gte(25000));

4.6,fuzzy模糊查询

GET /employees/_search
{"query": {"fuzzy": {"job": {"value": "javb","fuzziness": 1    //表示允许错一个字}}}
}

模糊查询的java方式如下

builder.query(QueryBuilders.fuzzyQuery("job","javb").fuzziness(Fuzziness.ONE));

4.7,highlight高亮查询

GET /employees/_search
{"query": {"term": {"job": {"value": "java"}}},"highlight": {"fields": {"*":{}}}
}

高亮查询的java方式如下

builder.query(QueryBuilders.termQuery("job","java"));
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field("job");
builder.highlighter(highlightBuilder);

5,聚合查询

5.1,aggs聚合查询

先通过job进行分组查询,再拿到结果后再进行stats查询,求最大值,最小值,平均值等

POST /employees/_search
{"size": 0,"aggs": {"name": {"terms": {"field": "job"},"aggs": {"stats_salary": {"stats": {"field": "salary"}}}}}
}

其java代码如下,需要注意的点就是,如果存在二级聚合,那么需要调用这个 subAggregation 方法,如果只需要聚合的结果而不需要查询的结果,可以直接在SearchSourceBuilder的实例设置为0即可。

@Test
public void toAgg() throws  Exception{//创建检索请求SearchRequest searchRequest = new SearchRequest();//指定索引searchRequest.indices("employees");//构建检索条件SearchSourceBuilder builder = new SearchSourceBuilder();//构建聚合条件TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("jobData").field("job");aggregationBuilder.subAggregation(AggregationBuilders.stats("salaryData").field("salary"));//将聚合条件加入到检索条件中builder.aggregation(aggregationBuilder);//只要聚合的结果,不需要查询的结果builder.size(0);searchRequest.source(builder);//执行检索SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println("检索结果:" + searchResponse);
}

打印的结果如下,和预期要打印的结果是一致的

{"took":4,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":10,"relation":"eq"},"max_score":null,"hits":[]},"aggregations":{"sterms#jobData":{"doc_count_error_upper_bound":0,"sum_other_doc_count":0,"buckets":[{"key":"java","doc_count":4,"stats#salaryData":{"count":4,"min":9000.0,"max":50000.0,"avg":25750.0,"sum":103000.0}},{"key":"c++","doc_count":2,"stats#salaryData":{"count":2,"min":20000.0,"max":20000.0,"avg":20000.0,"sum":40000.0}},{"key":"javascript","doc_count":2,"stats#salaryData":{"count":2,"min":18000.0,"max":25000.0,"avg":21500.0,"sum":43000.0}},{"key":"python","doc_count":2,"stats#salaryData":{"count":2,"min":18000.0,"max":35000.0,"avg":26500.0,"sum":53000.0}}]}}}

除了上面的state求全部的最大值,最小值等,还可以分别的求最大值,最小值,平均值,个数等,求平均值的的示例如下,需要使用到这个 AvgAggregationBuilder 构造器

AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("salaryData").field("salary");
//将聚合条件加入到检索条件中
builder.aggregation(avgAggregationBuilder);

求最大值的示例如下,需要使用到这个 MaxAggregationBuilder 构造器

MaxAggregationBuilder maxAggregationBuilder = AggregationBuilders.max("maxData").field("salary");
//将聚合条件加入到检索条件中builder.aggregation(maxAggregationBuilder);

求最小值的示例如下,需要使用到这个 MinAggregationBuilder 构造器

MinAggregationBuilder minAggregationBuilder = AggregationBuilders.min("minData").field("salary");
//将聚合条件加入到检索条件中
builder.aggregation(minAggregationBuilder);

求总个数的示例如下,需要使用到这个 ValueCountAggregationBuilder 构造器

ValueCountAggregationBuilder countBuilder = AggregationBuilders.count("countData").field("salary");
//将聚合条件加入到检索条件中
builder.aggregation(countBuilder);

5.2,获取最终结果

上面在查询之后,会获取 SearchResponse 的对象,这里面就值执行查询后返回的结果

SearchResponse searchResponse

随后可以直接过滤结果,通过for循环去遍历这个 getHits

SearchHits hits = searchResponse.getHits();
SearchHit[] searchHits = hits.getHits();
for (SearchHit searchHit : searchHits) {String sourceAsString = searchHit.getSourceAsString();Employees employees = JSON.parseObject(sourceAsString, Employees.class);System.out.println(employees);}

或者直接获取聚合操作结果的值

//获取jobData聚合。还有Avg、Max、Min等
Terms maxData = aggregations.get("jobData");
for (Terms.Bucket bucket : maxData.getBuckets()) {String keyAsString = bucket.getKeyAsString();System.out.println("job职业:" + keyAsString + " 数量==> " + bucket.getDocCount());
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

麒麟系统 UFW 操作文档

麒麟系统 UFW 操作文档 1. UFW 介绍 ufw&#xff08;简单防火墙 Uncomplicated FireWall&#xff09;真正地简化了 iptables&#xff0c;虽然 ufw 的底层依 然会调用 iptables&#xff0c;但是配置防火墙规则时操作更加方便&#xff0c;命令更加简洁&#xff0c;本文档主要介…

Android Studio(对话框AlertDialog)

前言 前面介绍了常用控件的相关属性&#xff0c;那些控件的使用起来也很容易。在本节及后面的章节介绍的控件将是相比于前面使用起来较为复杂的&#xff08;不过使用多了&#xff0c;也很容易上手&#xff09;。 这些控件常常需要配合java代码来使用&#xff0c;比如说对话框、…

三国志14信息查询小程序(历史武将信息一览)制作更新过程03-主要页面的设计

1&#xff0c;小程序的默认显示 分为三部分&#xff0c;头部的标题、中间的内容区和底部的标签栏。点击标签可以切换不同页面&#xff0c;这是在app.json文件中配置的。代码如下&#xff1a; //所有用到的页面都需要在 pages 数组中列出&#xff0c;否则小程序可能会出现错误或…

Red Giant Trapcode Suite 2024.0.1

Red Giant Trapcode Suite是一款ae视觉效果插件软件&#xff0c;适用于After Effects和Premiere Pro等流行的视频编辑软件。该软件集合了一系列强大而创新的工具&#xff0c;可以帮助用户创建令人惊叹的视觉效果和动态图形。 Red Giant Trapcode Suite包含多种插件&#xff0c…

GPT-4V:AI在医疗领域的应用

OpenAI最新发布的GPT-4V模型为ChatGPT增添了语音和图像功能&#xff0c;为用户提供了更多在日常生活中使用ChatGPT的方式。这次更新将为用户带来更加便捷、直观的交互体验&#xff0c;用户可以直接通过拍照上传图片&#xff0c;并提出相关问题。OpenAI的最终目标是构建一个安全…

安卓系统手机便签app使用哪一款?

在现代快节奏的生活中&#xff0c;我们经常会遇到各种繁忙的事务和容易遗忘的备忘事项。为避免大家遗忘重要的事情&#xff0c;大家可以在常用的手机上安装记录备忘事项的工具&#xff0c;为了帮助安卓用户高效地记录和管理这些信息&#xff0c;今天我将向大家推荐一款功能强大…

ElasticSearch集群环境搭建

1、准备三台服务器 这里准备三台服务器如下: IP地址主机名节点名192.168.225.65linux1node-1192.168.225.66linux2node-2192.168.225.67linux3node-3 2、准备elasticsearch安装环境 (1)编辑/etc/hosts&#xff08;三台服务器都执行&#xff09; vim /etc/hosts 添加如下内…

竞赛选题 深度学习大数据物流平台 python

文章目录 0 前言1 课题背景2 物流大数据平台的架构与设计3 智能车货匹配推荐算法的实现**1\. 问题陈述****2\. 算法模型**3\. 模型构建总览 **4 司机标签体系的搭建及算法****1\. 冷启动**2\. LSTM多标签模型算法 5 货运价格预测6 总结7 部分核心代码8 最后 0 前言 &#x1f5…

数学建模比赛中常用的建模提示词(数模prompt)

以下为数学建模比赛中常用的建模提示词&#xff0c;希望对你有所帮助&#xff01; 帮我总结一下数学建模有哪些预测类算法&#xff1f; 灰色预测模型级比检验是什么意思? 描述一下BP神经网络算法的建模步骤 对于分类变量与分类变量相关性分析用什么算法 前10年的数据分别是1&a…

QT 实现两款自定义的温度计/湿度控件

文章目录 0 引入1、带有标尺的温度/湿度计控件1.头文件2.核心代码 2、竖起来的温度/湿度计控件1.头文件2.实现 3、引用 0 引入 QT原生控件没有实现如仪表盘或者温度计的控件&#xff0c;只好自己实现&#xff0c;文章代码部分参考引用的文章。直接上图 图一 带有标尺的温度计…

「随笔」IT行业哪个方向比较好就业

一、IT行业就业的PEST分析 在当前的全球经济环境下&#xff0c;IT行业的发展迅速&#xff0c;就业前景广阔。以下从政治、经济、社会和科技四个维度对IT行业就业进行PEST分析。 1.1 政治&#xff08;Political&#xff09; 政府政策&#xff1a;近年来&#xff0c;各国政府都…

gma 1.x 气候气象指数计算源代码(分享)

本模块的主要内建子模块如下&#xff1a; 如何获得完整代码&#xff1a; 回复博主 或者 留言/私信 。 注意&#xff1a;本代码完全开源&#xff0c;可随意修改使用。 但如果您的成果使用或参考了本段代码&#xff0c;给予一定的引用说明&#xff08;非强制&#xff09;&#xf…

python 数据挖掘库orange3 介绍

orange3 是一个非常适合初学者的data mining library. 它让使用者通过拖拽内置的组件来形成工作流。让你不需要写任何代码就可以体验到数据挖掘和可视化的魅力。 它的桌面如下&#xff0c;这里我创建了 3 个节点&#xff0c;分别是数据集、小提琴图&#xff0c;散点图 其中 …

[NLP] Llama2模型运行在Mac机器

本文将介绍如何使用llama.cpp在MacBook Pro本地部署运行量化版本的Llama2模型推理&#xff0c;并基于LangChain在本地构建一个简单的文档Q&A应用。本文实验环境为Apple M1 芯片 8GB内存。 Llama2和llama.cpp Llama2是Meta AI开发的Llama大语言模型的迭代版本&#xff0c;…

泛微OA_lang2sql 任意文件上传漏洞复现

简介 泛微OA E-mobile系统 lang2sql接口存在任意文件上传漏洞&#xff0c;由于后端源码中没有对文件没有校验&#xff0c;导致任意文件上传。攻击者可利用该参数构造恶意数据包进行上传漏洞攻击。 漏洞复现 FOFA语法&#xff1a; title"移动管理平台-企业管理" 页…

移远通信蝉联“年度杰出创新企业”大奖,以核心技术实力永攀行业高峰

11月2日&#xff0c;“国际集成电路展览会暨研讨会”&#xff08;IIC Shenzhen 2023&#xff09;在深圳大中华交易广场重磅启幕。业界领袖共探国内外创新技术与产品成果&#xff0c;并对推动全球电子产业创新做出贡献的企业进行了表彰。其中&#xff0c;全球领先的物联网整体解…

<蓝桥杯软件赛>零基础备赛20周--第4周--杂题-1

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周&#xff08;读者可以按…

Mysql学习文档笔记

文章目录 基础篇通用语法及分类DDL&#xff08;数据定义语言&#xff09;数据库操作注意事项 表操作 DML&#xff08;数据操作语言&#xff09;添加数据注意事项 更新和删除数据 DQL&#xff08;数据查询语言&#xff09;基础查询条件查询聚合查询&#xff08;聚合函数&#xf…

电商创业:如何迈出第一步,6点决策小建议可以好好看看

电商创业&#xff1a;如何迈出第一步&#xff0c;6点决策小建议可以好好看看 随着互联网的普及和电子商务的快速发展&#xff0c;越来越多的人开始将目光投向电商领域&#xff0c;希望通过开设自己的网店或电商平台来实现创业梦想。然而&#xff0c;对于许多新手来说&#xff0…

软件测试面试大家是不是一问到项目就不会了?

软件测试面试中&#xff0c;介绍做过的项目&#xff0c;可以说是必不可少的一道面试题了&#xff0c;对于面试的同学来说&#xff0c;该自己发挥呢&#xff1f; 把项目的所有功能噼里啪啦说一遍就完事了&#xff1f;当然不是&#xff0c;我们要搞清楚&#xff0c;面试官问这个…