SpringBoot+ElasticSearch 实现模糊查询,批量CRUD,排序,分页,高亮!

news2024/9/26 3:29:00

一、导入elasticsearch依赖

在pom.xml里加入如下依赖

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

非常重要:检查依赖版本是否与你当前所用的版本是否一致,如果不一致,会连接失败!

二、创建高级客户端

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ElasticSearchClientConfig {
    @Bean
    public RestHighLevelClient restHighLevelClient(){
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("服务器IP", 9200, "http")));
        return client;
    }
}

三、基本用法

1.创建、判断存在、删除索引

import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
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.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;

@SpringBootTest
class ElasticsearchApplicationTests {

 @Autowired
 private RestHighLevelClient restHighLevelClient;

 @Test
 void testCreateIndex() throws IOException {
  //1.创建索引请求
  CreateIndexRequest request = new CreateIndexRequest("ljx666");
  //2.客户端执行请求IndicesClient,执行create方法创建索引,请求后获得响应
  CreateIndexResponse response=
    restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
  System.out.println(response);
 }

 @Test
 void testExistIndex() throws IOException {
        //1.查询索引请求
  GetIndexRequest request=new GetIndexRequest("ljx666");
        //2.执行exists方法判断是否存在
  boolean exists=restHighLevelClient.indices().exists(request,RequestOptions.DEFAULT);
  System.out.println(exists);
 }

 @Test
 void testDeleteIndex() throws IOException {
        //1.删除索引请求
  DeleteIndexRequest request=new DeleteIndexRequest("ljx666");
        //执行delete方法删除指定索引
  AcknowledgedResponse delete = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
  System.out.println(delete.isAcknowledged());
 }

}

2.对文档的CRUD

创建文档:

注意:如果添加时不指定文档ID,他就会随机生成一个ID,ID唯一。

创建文档时若该ID已存在,发送创建文档请求后会更新文档中的数据。

@Test
void testAddUser() throws IOException {
 //1.创建对象
 User user=new User("Go",21,new String[]{"内卷","吃饭"});
 //2.创建请求
 IndexRequest request=new IndexRequest("ljx666");
 //3.设置规则 PUT /ljx666/_doc/1
 //设置文档id=6,设置超时=1s等,不设置会使用默认的
 //同时支持链式编程如 request.id("6").timeout("1s");
 request.id("6");
 request.timeout("1s");

 //4.将数据放入请求,要将对象转化为json格式
    //XContentType.JSON,告诉它传的数据是JSON类型
 request.source(JSONValue.toJSONString(user), XContentType.JSON);
    
 //5.客户端发送请求,获取响应结果
 IndexResponse indexResponse=restHighLevelClient.index(request,RequestOptions.DEFAULT);
 System.out.println(indexResponse.toString());
 System.out.println(indexResponse.status());
}

获取文档中的数据:

@Test
void testGetUser() throws IOException {
 //1.创建请求,指定索引、文档id
 GetRequest request=new GetRequest("ljx666","1");
 GetResponse getResponse=restHighLevelClient.get(request,RequestOptions.DEFAULT);
  
 System.out.println(getResponse);//获取响应结果
 //getResponse.getSource() 返回的是Map集合
 System.out.println(getResponse.getSourceAsString());//获取响应结果source中内容,转化为字符串
  
}

更新文档数据:

注意:需要将User对象中的属性全部指定值,不然会被设置为空,如User只设置了名称,那么只有名称会被修改成功,其他会被修改为null。

@Test
void testUpdateUser() throws IOException {
 //1.创建请求,指定索引、文档id
 UpdateRequest request=new UpdateRequest("ljx666","6");

 User user =new User("GoGo",21,new String[]{"内卷","吃饭"});
 //将创建的对象放入文档中
 request.doc(JSONValue.toJSONString(user),XContentType.JSON);

 UpdateResponse updateResponse=restHighLevelClient.update(request,RequestOptions.DEFAULT);
 System.out.println(updateResponse.status());//更新成功返回OK
}

删除文档:

@Test
void testDeleteUser() throws IOException {
 //创建删除请求,指定要删除的索引与文档ID
 DeleteRequest request=new DeleteRequest("ljx666","6");

 DeleteResponse updateResponse=restHighLevelClient.delete(request,RequestOptions.DEFAULT);
 System.out.println(updateResponse.status());//删除成功返回OK,没有找到返回NOT_FOUND
}

3.批量CRUD数据

这里只列出了批量插入数据,其他与此类似。

注意:hasFailures()方法是返回是否失败,即它的值为false时说明上传成功

@Test
void testBulkAddUser() throws IOException {
 BulkRequest bulkRequest=new BulkRequest();
 //设置超时
 bulkRequest.timeout("10s");

 ArrayList<User> list=new ArrayList<>();
 list.add(new User("Java",25,new String[]{"内卷"}));
 list.add(new User("Go",18,new String[]{"内卷"}));
 list.add(new User("C",30,new String[]{"内卷"}));
 list.add(new User("C++",26,new String[]{"内卷"}));
 list.add(new User("Python",20,new String[]{"内卷"}));

 int id=1;
 //批量处理请求
 for (User u :list){
  //不设置id会生成随机id
  bulkRequest.add(new IndexRequest("ljx666")
    .id(""+(id++))
    .source(JSONValue.toJSONString(u),XContentType.JSON));
 }

 BulkResponse bulkResponse=restHighLevelClient.bulk(bulkRequest,RequestOptions.DEFAULT);
 System.out.println(bulkResponse.hasFailures());//是否执行失败,false为执行成功
}

4.查询所有、模糊查询、分页查询、排序、高亮显示

@Test
void testSearch() throws IOException {
 SearchRequest searchRequest=new SearchRequest("ljx666");//里面可以放多个索引
 SearchSourceBuilder sourceBuilder=new SearchSourceBuilder();//构造搜索条件

 //此处可以使用QueryBuilders工具类中的方法
 //1.查询所有
 sourceBuilder.query(QueryBuilders.matchAllQuery());
 //2.查询name中含有Java的
 sourceBuilder.query(QueryBuilders.multiMatchQuery("java","name"));
 //3.分页查询
 sourceBuilder.from(0).size(5);
    
 //4.按照score正序排列
 //sourceBuilder.sort(SortBuilders.scoreSort().order(SortOrder.ASC));
 //5.按照id倒序排列(score会失效返回NaN)
 //sourceBuilder.sort(SortBuilders.fieldSort("_id").order(SortOrder.DESC));

 //6.给指定字段加上指定高亮样式
 HighlightBuilder highlightBuilder=new HighlightBuilder();
 highlightBuilder.field("name").preTags("<span style='color:red;'>").postTags("</span>");
 sourceBuilder.highlighter(highlightBuilder);
  
 searchRequest.source(sourceBuilder);
 SearchResponse searchResponse=restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);

 //获取总条数
 System.out.println(searchResponse.getHits().getTotalHits().value);
 //输出结果数据(如果不设置返回条数,大于10条默认只返回10条)
 SearchHit[] hits=searchResponse.getHits().getHits();
 for(SearchHit hit :hits){
  System.out.println("分数:"+hit.getScore());
  Map<String,Object> source=hit.getSourceAsMap();
  System.out.println("index->"+hit.getIndex());
  System.out.println("id->"+hit.getId());
  for(Map.Entry<String,Object> s:source.entrySet()){
   System.out.println(s.getKey()+"--"+s.getValue());
  }
 }
}

四、总结

1.大致流程

创建对应的请求 --> 设置请求(添加规则,添加数据等) --> 执行对应的方法(传入请求,默认请求选项)–> 接收响应结果(执行方法返回值)–> 输出响应结果中需要的数据(source,status等)

2.注意事项

  • 如果不指定id,会自动生成一个随机id

  • 正常情况下,不应该这样使用new IndexRequest(“ljx777”),如果索引发生改变了,那么代码都需要修改,可以定义一个枚举类或者一个专门存放常量的类,将变量用final static等进行修饰,并指定索引值。其他地方引用该常量即可,需要修改也只需修改该类即可。

  • elasticsearch相关的东西,版本都必须一致,不然会报错

  • elasticsearch很消耗内存,建议在内存较大的服务器上运行elasticsearch,否则会因为内存不足导致elasticsearch自动killed

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

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

相关文章

【图像隐写】DWT数字水印嵌入+攻击+提取【含Matlab源码 1759期】

⛄一、DWT数字水印简介 1 引言 数字水印技术发展迅速&#xff0c;出现了各种水印算法&#xff0c;最低有效位(Least Significant Bit,LSB)数字水印技术是最早的空域水印添加算法&#xff0c;它原理简单且易实现&#xff0c;但鲁棒性差。变换域水印算法大大提高了水印的鲁棒性&…

【微信小程序】博客小程序,静态版本(三)设计和开发首页、个人关于页

【博客小程序】专栏 【微信小程序】博客小程序&#xff0c;静态版本&#xff08;一&#xff09;准备工作 【微信小程序】博客小程序&#xff0c;静态版本&#xff08;二&#xff09;引入 lin-ui 组件、设计和开发文章页 【微信小程序】博客小程序&#xff0c;静态版本&#…

模型推荐丨政务大数据项目案例模型分享

主要工具&#xff1a;Python 技术大类&#xff1a;自然语言处理 主要业务问题&#xff1a; 在社会治理上&#xff0c;政府部门一般通过群众的意见反馈、舆论情绪&#xff0c;掌握社会现状&#xff0c;做好舆情工作&#xff0c;以促进社会长治久安。微博作为有着大量活跃用户…

13 Igress,集群进出流量的总管

文章目录1. 前言2. 为什么要有 Ingress?2.1 Service 的缺点2.2 (Ingress)怎么解决Service 的缺点&#xff1f;3. 为什么要有 Ingress Controller 和 IngressClass?3.1 为什么要有 Ingress Controller&#xff1f;3.1.1 Ingress Controller3.1.1 Ingress Controller 常见公司3…

深入学习Linux内核(二)体系结构简析

Linux内核体系结构简析 图1 Linux系统层次结构 最上面是用户&#xff08;或应用程序&#xff09;空间。这是用户应用程序执行的地方。用户空间之下是内核空间&#xff0c;Linux 内核正是位于这里。GNU C Library &#xff08;glibc&#xff09;也在这里。它提供了连接内核的系…

Jitter

1、Jitter定义 定义1&#xff08;SONET规范&#xff09; 抖动可以定义为数字信号在重要时点上偏离理想时间位置的短期变化。 Long term jitter 测量由参考点滞后相当数量的Cycle&#xff08;500~1000&#xff09;后时钟的抖动值。该抖动参数也是时钟稳定性的一个重要指标&a…

如何清除电脑缓存?让电脑运行速度提升的有效方法

随着时间的流逝&#xff0c;电脑保存太多缓存文件&#xff0c;电脑的运行速度会越来越慢&#xff0c;甚至无法启动。当出现这种情况时&#xff0c;我们就需要对电脑进行清理。那么如何清除电脑缓存&#xff1f;今天就来给大家分享几个方法&#xff0c;让你的电脑运行速度快起来…

Spark SQL 与 Hive 的小文件调优

文章目录小文件危害表的缓存shuffle 分区数调整Spark SQL 客户端设置合并Hive 客户端处理小文件合并小文件危害 小文件会造成 nn 处理压力变大&#xff0c;大大降低了读取性能&#xff0c;整个 HDFS 文件系统访问缓慢&#xff0c;大量的小文件还会导致 nn 内存溢出&#xff0c…

DataX使用、同步MySQL数据到HDFS案例

文章目录4. DataX使用4.1 DataX使用概述4.1.1 DataX任务提交命令4.1.2 DataX配置文件格式4.2 同步MySQL数据到HDFS案例4.2.1 MySQLReader之TableMode4.2.1.1 编写配置文件4.2.1.1.1 创建配置文件base_province.json4.2.1.1.2 配置文件内容如下4.2.1.2 配置文件说明4.2.1.2.1 Re…

jdk 11 自带的HttpClient

jdk 11 自带的HttpClient 文章目录jdk 11 自带的HttpClient步骤1&#xff1a;创建jdk HttpClient 对象步骤2&#xff1a;创建请求步骤3&#xff1a;使用client.sent()发送同步请求步骤4&#xff1a;处理响应下面是发送post请求&#xff0c;请求类型是json&#xff0c;使用clien…

汇智动力《软件测试课程V8.0版本》正式发布!

今年是汇智动力建校的第八个年头&#xff0c;这一路走来&#xff0c;我们始终抓住时代的机遇与发展同辉、与时代俱兴&#xff0c;助力千万学子圆梦互联网。时代在飞速发展&#xff0c;社会在不断进步&#xff0c;为了使汇智学子适应科技变化的需要&#xff0c;汇智动力《软件测…

限量版Spring实战笔记与其在收藏里吃灰,不如大家一起学习,欸 大家一起卷!

写在前面 作为一个java程序员&#xff0c;spring应该都不会陌生了吧&#xff1f; 对于大部分程序员来说&#xff0c;spring的入门&#xff0c;估计跑起一个框架&#xff0c;熟悉一下开发的流程&#xff0c;基本上就掌握spring框架的开发了。 随着开发年限的变大&#xff0c;我…

解决Netty那些事儿之Reactor在Netty中的实现(创建篇)-下

接上文解决Netty那些事儿之Reactor在Netty中的实现(创建篇)-上 Netty对JDK NIO 原生Selector的优化 首先在NioEventLoop中有一个Selector优化开关DISABLE_KEY_SET_OPTIMIZATION,通过系统变量-D io.netty.noKeySetOptimization指定&#xff0c;默认是开启的&#xff0c;表示需…

[附源码]计算机毕业设计疫情防控平台Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【OpenCV-Python】教程:3-14 Hough 圆变换

OpenCV Python Hough 圆变换 【目标】 学习用 Hough 变换检测圆cv2.HoughCircles() 【理论】 圆的数学表达式是 (x−xcenter)2(y−ycenter)2r2(x-x_{center})^2 (y-y_{center})^2 r^2 (x−xcenter​)2(y−ycenter​)2r2 其中 (xcenter,ycenter)(x_{center}, y_{center})…

[附源码]计算机毕业设计志愿者服务平台Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

matlab测量计算信号的相似度

本示例说明如何测量信号相似度。最近我们被客户要求撰写关于计算信号的相似度的研究报告&#xff0c;包括一些图形和统计输出。 将回答以下问题&#xff1a;如何比较具有不同长度或不同采样率的信号&#xff1f;如何确定测量中是否存在信号或仅有噪声&#xff1f;有两个信号…

校园论坛(Java)—— 考研学习模块

校园论坛&#xff08;Java&#xff09;—— 考研学习模块 文章目录校园论坛&#xff08;Java&#xff09;—— 考研学习模块1、写在前面2、系统结构设计2.1 各个页面之间的调用关系2.2. 登录注册模块各层的设计3、考研学习模块设计3.1 浏览和查看帖子3.2 发表帖子3.3 删除帖子3…

GJB 5000B二级-CM配置管理

主要变化情况 继承3条、修订3条 一、修订的主要内容 CM2.2 建立并维护配置管理系统(SP1.2:建立配置管理系统). 实践陈述:建立并维护配置管理系统和管理规程,建立多级控制机制,实现对已标识配置项的存储、检索、访问控制、变更控制、备份和恢复; CM2.4:跟踪和控制变更…

数据结构-难点突破(C++实现图的基本操作(邻接矩阵,邻接表,十字链表法储存代码))

关于图的数据结构&#xff0c;我曾经自己学过一部分&#xff0c;图论专栏&#xff0c;但是学习本就是重复的过程&#xff0c;这里打算系统的学习一下图。第一步当然是图的储存和基本操作的实现。 要用C实现图的基本操作 Adjacent(x&#xff0c;y)&#xff1a;判断图是否存在边…