六、SpringBoot集成elasticsearch

news2024/11/26 10:04:59

目录

官网API介绍

1、新建maven项目

2、检查elasticsearch依赖的版本

3、配置RestHighLevelClient对象

4、使用springboot-test测试API的使用


官网API介绍

Java API Client

https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/index.html

Java REST Client(rest-high-level-client):

https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html

Java REST Client依赖

<dependency>

    <groupId>org.elasticsearch.client</groupId>

    <artifactId>elasticsearch-rest-high-level-client</artifactId>

</dependency>

使用对象操作es

RestHighLevelClient client = new RestHighLevelClient(

        RestClient.builder(

                new HttpHost("localhost", 9200, "http")));

操作完后关闭连接

client.close();

1、新建maven项目

测试springboot集成elasticsearch的API使用

在新项目的pom文件中添加依赖

<!--导入了elasticsearch依赖-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!-- 引入fastjson依赖,发送elasticsearch的请求体时需要将对象转化为json字符串-->
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.62</version>
</dependency>
<!--引入lombok插件依赖,生成实体类的get、set等方法-->
<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <optional>true</optional>
</dependency>
<!--引入springboot测试依赖-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
   <scope>test</scope>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-devtools</artifactId>
   <scope>runtime</scope>
   <optional>true</optional>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-configuration-processor</artifactId>
   <optional>true</optional>
</dependency>

2、检查elasticsearch依赖的版本

        导入elasticsearch依赖后检查org.elasticsearch.clienttransport版本号是否与本地版本elasticsearch的版本号一样,不一样进行调整,避免进行elasticsearch连接时出现兼容性问题导致发送的请求有问题

spring-boot-dependencies-2.2.5.RELEASE默认依赖的elasticsearch为6.8.6

此时需要在新建项目的pom文件中指定自己本地的版本号

<!--配置版本信息-->
<properties>
   <!--配置java版本-->
   <java.version>1.8</java.version>
   <!--自定义es版本依赖,保证和本地一致-->
   <elasticsearch.version>7.6.1</elasticsearch.version>
</properties>

配置完后刷新Maven

 3、配置RestHighLevelClient对象

@Configuration
public class esConfig {

    @Bean
    public RestHighLevelClient restHighLevelClient() {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http"),
                        new HttpHost("localhost", 9201, "http")//有多个elasticsearch实例
                       ));
        return client;
    }

}

4、使用springboot-test测试API的使用

import com.alibaba.fastjson.JSON;
import com.chen.esapi.pojo.User;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.IndicesClient;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.client.indices.GetIndexResponse;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;

@SpringBootTest
class EsApiApplicationTests {

   @Resource
   private RestHighLevelClient restHighLevelClient;

   @Resource
   private User user;

   //测试创建索引CreateIndexRequest
   @Test
   public void testCreateIndex() throws IOException {
      //1、创建索引请求
      CreateIndexRequest request = new CreateIndexRequest("test_index");
      //2、执行请求
      IndicesClient indicesClient = restHighLevelClient.indices();
      CreateIndexResponse createIndexResponse = indicesClient.create(request, RequestOptions.DEFAULT);
      System.out.println(createIndexResponse);
   }

   //测试获取索引GetIndexRequest
   @Test
   public void testGetIndex() throws IOException {
      //1、创建索引请求
      GetIndexRequest request = new GetIndexRequest("test_index");
      //2、执行请求
      IndicesClient indicesClient = restHighLevelClient.indices();
      GetIndexResponse getIndexResponse = indicesClient.get(request, RequestOptions.DEFAULT);
      System.out.println(getIndexResponse.getIndices());
      //判断索引是否存在
      boolean exists = indicesClient.exists(request, RequestOptions.DEFAULT);
      System.out.println(exists);
   }

   //测试删除索引DeleteIndexRequest
   @Test
   public void testDeleteIndex() throws IOException {
      //1、创建索引请求
      DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("test_index");
      //2、执行请求
      IndicesClient indicesClient = restHighLevelClient.indices();
      AcknowledgedResponse delete = indicesClient.delete(deleteIndexRequest, RequestOptions.DEFAULT);
      System.out.println(delete.isAcknowledged());
   }


   //测试添加文档
   @Test
   public void testCreateDocument() throws IOException {
      //创建对象
      user.setId(3);
      user.setName("李四");
      //创建请求
      IndexRequest request = new IndexRequest("test_index");
      //设置规则
      request.id("1");
      request.timeout(TimeValue.timeValueSeconds(1));
      request.source(JSON.toJSONString(user), XContentType.JSON);
      //执行请求,并获取响应结果
      IndexResponse indexResponse = restHighLevelClient.index(request, RequestOptions.DEFAULT);
      System.out.println(indexResponse.toString());


   }

   //判断文档是否存在
//获取文档
   @Test
   public void testGetDocument() throws IOException {
      //创建请求
      GetRequest getRequest = new GetRequest("test_index","1");
      //判断文档是否存在
      boolean exists = restHighLevelClient.exists(getRequest, RequestOptions.DEFAULT);
      System.out.println(exists);
      //执行请求获取文档信息
      GetResponse documentFields = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
      String sourceAsString = documentFields.getSourceAsString();
      System.out.println(sourceAsString);
   }

   //更新文档
   @Test
   public void testUpdateDocument() throws IOException {
      //创建请求
      UpdateRequest updateRequest = new UpdateRequest("test_index","1");
      user.setName("王五");
      updateRequest.doc(JSON.toJSONString(user),XContentType.JSON);
      UpdateResponse update = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
      System.out.println(update);
   }

   //删除文档
   @Test
   public void testDeleteDocument() throws IOException {
      //创建请求
      DeleteRequest deleteRequest = new DeleteRequest("test_index", "1");
      //执行请求
      DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
      System.out.println(deleteResponse.status());
   }

   //批量插入
   @Test
   public void TestBulkInsert() throws IOException {
      //创建请求
      BulkRequest bulkRequest = new BulkRequest();
      bulkRequest.timeout("10s");
      //设置数据
      ArrayList<Object> userlist = new ArrayList<>();
      for (int i = 0; i <10 ; i++) {
         User user = new User("test user" + i, i);
         userlist.add(user);
      }
      System.out.println(userlist);
      for (int i = 0; i < userlist.size(); i++) {
         bulkRequest.add(
               new IndexRequest("test_index")
               .id((i+1)+"")
               .source(JSON.toJSONString(userlist.get(i)),XContentType.JSON)
         );
      }
      System.out.println(bulkRequest);
        //执行请求
      BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
      System.out.println(bulkResponse.status());
   }

   //查询(重点)
   // SearchRequest搜索请求
   // SearchSourceBuilder条件构造
   // QueryBuilder构造查询参数
   @Test
   public void testSearch() throws IOException {
      SearchRequest request = new SearchRequest("test_index");
      //创建查询构造器
      SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
      //通过QueryBuilders工具类构建查询条件
      //构建term精确查询条件
//    TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "user5");
//    searchSourceBuilder.query(termQueryBuilder);
      //构建mathch查询条件
      MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "test");
      MatchQueryBuilder matchQueryBuilder1 = QueryBuilders.matchQuery("id", "3");
      //构建布尔查询
      BoolQueryBuilder must = QueryBuilders.boolQuery().must(matchQueryBuilder).must(matchQueryBuilder1);
      System.out.println(must);
      //使用query封装查询参数
      searchSourceBuilder.query(must);
      //设置超时时间
      searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
      //设置分页
      searchSourceBuilder.from(0);
      searchSourceBuilder.size(10);
      //将查询条件配置到请求中
      request.source(searchSourceBuilder);
      //执行请求
      SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
      System.out.println(searchResponse);
      //将结果打印searchResponse.getHits().getHits()
      for (SearchHit document :searchResponse.getHits().getHits() ){
         System.out.println(document.getSourceAsString());
      }
   }
}

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

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

相关文章

TypeScript基础使用方法

Author: 德玛玩前端 Date: 2023-06-07 TypeScript 一、Typescript介绍 1.1、TypeScript产生的原因 旧JS是弱类型语言&#xff0c;一个变量先后可以保存不同类型的数据&#xff0c;所以不可靠。旧JS是解释执行语言&#xff0c;一边解释&#xff0c;一边执行&#xff0c;一些低…

python接口自动化(二)--什么是接口测试、为什么要做接口测试(详解)

简介 上一篇和大家一起科普扫盲接口后&#xff0c;知道什么是接口&#xff0c;接口类型等&#xff0c;对其有了大致了解之后&#xff0c;我们就回到主题-接口测试。 什么是接口测试 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各…

7.SpringCloudAlibaba 整合 Sentinel

一、分布式系统遇到的问题 1 服务雪崩效应 在分布式系统中,由于网络原因或自身的原因,服务一般无法保证 100%是可用的。如果一个服务出现了问题,调用这个服务就会出现线程阻塞的情况,此时若有大量的请求涌入,就会出现多条线程阻塞等待,进而导致调用服务瘫痪。 由于服务…

SDP协议是什么,详解SDP协议

一、SDP协议简介 SDP&#xff08;Session Description Protocol&#xff09;是一种会话描述协议&#xff0c;用于描述多媒体会话的参数。它是一种文本协议&#xff0c;通常用于VoIP&#xff08;Voice over Internet Protocol&#xff09;和视频会议等应用中。SDP协议定义了一种…

【自监督论文阅读 1】SimCLR

文章目录 一、摘要二、引言三、方法3.1 主要框架3.2 训练一个大的batchsize 四、数据增强4.1 实验一 数据增强的组合对学习好的特征表达非常重要4.2 对比学习需要更多的数据增强 五、一些实验证明5.1 大模型更有利于无监督对比学习5.2 非线性层的预测头增加了特征表示5.3可调节…

使用vtkWindow报错Debug Assertion Failed ... mfc140d.dll

环境&#xff1a;VS2022VTK7.1.1&#xff0c;还使用了MFC 报错信息 Debug Assertion Failed! Program: C:\WINDOWS SYSTEM32 mfc140d.dll File. D: a work 1 s src vctools VC7Libs ship ATLMFCnclude afxwin1.inLine: 21 For information on how your program can cause an a…

2023年智能优化算法之——能量谷优化器 Energy valley optimizer(EVO),附MATLAB代码和文献

能量谷优化器(EVO)是一种新的元启发式算法&#xff0c;它的算法是受到了关于稳定性和不同粒子衰变模式的先进物理原理的启发。在文献中&#xff0c;作者与CEC函数中最先进的算法进行了比较&#xff0c;并且证明该算法确实很强劲。算法原理大家请参考文献。 [1] Azizi M , Aic…

考研算法第27天:直接插入排序 【插入排序】

插入排序算法介绍 老规矩我们来模拟一遍样例&#xff1a; 其思想简单来说就是将旧数组的每个数放入到新数组中 但是每次放入都要遵守下面的原则&#xff1a;如果前面有比当前数大的数便把它放到当前数的后面去。 过程如下面这张图 https://ts1.cn.mm.bing.net/th/id/R-C.1d…

GPT-4满分通过MIT本科数学考试!这套提示词火了

量子位 | 公众号 QbitAI 万万想不到啊&#xff0c;MIT数学考试&#xff0c;被GPT-4攻破了&#xff1f;&#xff01; 突然有人在最新论文工作中高调宣布&#xff1a; GPT-4在MIT的数学和EECS&#xff08;电气工程和计算机科学系&#xff09;本科学位考试中&#xff0c;表现出…

电商超卖,从业务到设计

编辑导语&#xff1a;超卖这一概念的定义可以从不同层面进行阐述&#xff0c;比如平台层面、渠道层面、仓库层面等。而假设因超卖导致订单难以履行&#xff0c;则容易让用户体验“打折”。为什么有时电商超卖的现象会发生&#xff1f;可以从哪些角度来降低超卖导致的风险&#…

Stable diffusion WebUI LoRA使用教学

在Stable Diffusion网络中&#xff0c;通常会下载社区中的LoRA模型&#xff0c;并对CLIP模型和Unet的CrossAttention的线性层进行微调。相应的被微调的层会有 lora_up 和 lora_down 两组参数&#xff0c;分别对应上述的 A 和 B 矩阵。参考高手的代码&#xff0c;只需根据LoRA保…

【Unity Shader】从入门到感慨万千(1)基本概念:什么是网格?什么是材质和Shader?

文章目录 一、什么是网格(Mesh)?二、什么是MeshFilter(网格过滤器)?三、什么是MeshRenderer(网格渲染器)?四、什么是材质(Material)?五、什么是Shader(着色器)?一、什么是网格(Mesh)? 如上图,模型的三角形面就叫做网格(Mesh),它的本质是一堆顶点数据的规则…

ShowMeBug与极狐(GitLab)战略合作,推动DevOps人才高效甄选

近日&#xff0c;ShowMeBug与领先的开放式一体化安全DevOps平台提供商极狐(GitLab)达成深度合作协议&#xff0c;双方将致力于共同打造具有行业强认可度以及高实用性的DevOps岗位题型&#xff0c;助力企业通过更为专业、标准的技术笔试题型&#xff0c;提升DevOps岗位人才筛选效…

关于智能指针的补充1(share_ptr、weak_ptr 相互配合使用)

关于智能指针的补充1 1.share_ptr存在的问题2.weak_ptr2.1介绍2.2weak_ptr 核心代码逻辑 1.share_ptr存在的问题 先看这样一段代码 #define _CRT_SECURE_NO_WARNINGS using namespace std; #include"smartptr.h" struct ListNode {GXPYY::shared_ptr<ListNode&g…

Unity核心3——2D物理系统

一、刚体 Rigid Body 2D ​ 刚体是物理系统中用于帮助我们进行模拟物理碰撞中力的效果的 ​ 2D 物理系统中的刚体和 3D 中的刚体基本是一样的&#xff0c;最大的区别是对象只会在 XY 平面中移动&#xff0c;并且只在垂直于该平面的轴上旋转 ​ 不同于 3D 刚体&#xff0c;2D…

【Vue2】PaginationSelect 带分页和搜索功能的下拉列表组件

1. 效果图 2. 组件完整代码 <template><div class"pagination-select"><el-selectv-model"selectedValue":style"{ width: width || 100% }"v-bind"attrs":remote-method"remoteMethod":loading"loadi…

【好书精读】网络是怎样连接的 向 DNS 服务器查询 Web 服务器的 IP 地址

&#xff08;该图由AI制作 学习AI绘图 联系我&#xff09; 目录 IP 地址的基本知识 实际的 IP 地址 域名和 IP 地址并用的理由 Socket 库提供查询 IP 地址的功能 通过解析器向 DNS 服务器发出查询 解析器的内部原理 IP 地址的基本知识 生成 HTTP 消息 根据域名查询 …

(嵌入式)TMS5700432BPZQQ1R、SPC58EC80E5QMC1X微控制器IC中文数据

TMS5700432BPZQQ1R 32位RISC闪存微控制器是设计用于安全系统的高性能汽车级微控制器。其采用的安全架构包括锁步中的双CPU、CPU和内存内置自检 (BIST) 逻辑、闪存和数据SRAM上的ECC、外设存储器上的奇偶校验以及外设I/O上的回路功能。TMS570LS0432/0332器件集成了ARM Cortex-R4…

孤立森林详解

基本概念 孤立森林&#xff08;Isolation Forest&#xff09;是一种基于异常检测的机器学习算法&#xff0c;用于识别数据集中的异常点。孤立森林算法在异常检测、网络入侵检测、金融欺诈检测等领域有广泛应用&#xff0c;并且在处理大规模数据和高维数据时表现出色。孤立森林…