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

news2024/10/7 5:54:27

准备工作

准备一个空的SpringBoot项目

写入依赖

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

注意你的SpringBoot和你的es版本,一定要对应,如果不知道的可以查看这篇文章:https://blog.csdn.net/u014641168/article/details/130386872

我的版本是2.2.6,所以用的ES版本是 6.8.12,安装es请看这篇文章:https://blog.csdn.net/u014641168/article/details/130622430
在这里插入图片描述
查看ES版本
在这里插入图片描述
在这里插入图片描述

配置

创建ES配置文件,下面有2个Bean,一个是你的ES有账号密码的,另一个默认是没有的。

package cn.ityao.es.config;

import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Author tongyao
 */
@Configuration
public class ElasticsearchConfig {
    @Value("${elasticsearch.port}")
    private int port;

    @Value("${elasticsearch.ip}")
    private String ip;

    @Value("${elasticsearch.username}")
    private String username;

    @Value("${elasticsearch.password}")
    private String password;

    /**
     * 创建带HTTP Basic Auth认证rest客户端
     */
    @Bean
    public RestHighLevelClient restHighLevelClient() {
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
        return new RestHighLevelClient(RestClient.builder(
                new HttpHost[]{
                    new HttpHost(ip, port, "http")
                }).setHttpClientConfigCallback((HttpAsyncClientBuilder httpAsyncClientBuilder) -> httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider)));
    }

    //不带用户名密码验证
    //@Bean
    public RestHighLevelClient restClient() {
        return new RestHighLevelClient(RestClient.builder(new HttpHost[]{
                new HttpHost(ip, port, "http")
        }));
    }
}

yml配置文件内容

server:
  # 服务端口
  port: 9990

elasticsearch:
  port: 9200
  ip: 127.0.0.1
  username: elastic
  password: 123456


# 查看es信息时需要的序列化
spring:
  jackson:
    serialization:
      FAIL_ON_EMPTY_BEANS: false

注入依赖

在controller下注入依赖

@Autowired
private RestHighLevelClient restHighLevelClient;

对索引的CURD

1、创建索引

/**
 * 创建索引
 *
 * @return
 * @throws IOException
 */
@GetMapping("/createIndex")
public Object createIndex() throws IOException {
	//1.创建索引请求
	CreateIndexRequest request = new CreateIndexRequest("testindex");
	//2.客户端执行请求IndicesClient,执行create方法创建索引,请求后获得响应
	CreateIndexResponse response =
			restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
	return response;
}

在这里插入图片描述
可以看到已经添加成功了,但是一定注意,索引名称,一定要小写!

2、查询索引

/**
 * 查询索引
 *
 * @return
 * @throws IOException
 */
@GetMapping("/searchIndex")
public Object searchIndex() throws IOException {
	//1.查询索引请求
	GetIndexRequest request = new GetIndexRequest("testindex");
	//2.执行exists方法判断是否存在
	boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
	return exists;
}

3、删除索引

/**
 * 删除索引
 *
 * @return
 * @throws IOException
 */
@GetMapping("delIndex")
public Object delIndex() throws IOException {
	//1.删除索引请求
	DeleteIndexRequest request = new DeleteIndexRequest("testindex");
	//执行delete方法删除指定索引
	AcknowledgedResponse delete = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
	return delete.isAcknowledged();
}

对文档的CRUD

1、新增文档

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

/**
 * 新增文档
 *
 * @return
 * @throws IOException
 */
@GetMapping("/add")
public Object add() throws IOException {
	//1.创建对象
	User user = new User("张三", 21);
	//2.创建请求(索引的名字)
	IndexRequest request = new IndexRequest("indexdocument");
	//3.设置规则 PUT /ljx666/_doc/1
	//设置文档id=6,设置超时=1s等,不设置会使用默认的
	//同时支持链式编程如 request.id("6").timeout("1s");
	request.id("6");
	// 指定要写入的 Index
	request.type("_doc");
	/*request.index("test");*/
	/*request.timeout(TimeValue.timeValueSeconds(1));*/
	request.timeout("1s");

	//4.将数据放入请求,要将对象转化为json格式
	//XContentType.JSON,告诉它传的数据是JSON类型
	request.source(JSON.toJSONString(user), XContentType.JSON);

	//5.客户端发送请求,获取响应结果
	IndexResponse indexResponse = restHighLevelClient.index(request, RequestOptions.DEFAULT);
	System.out.println(indexResponse.toString());
	System.out.println(indexResponse.status());
	return indexResponse;
}

2、查询文档中的数据

/**
 * 获取文档中的数据
 *
 * @return
 * @throws IOException
 */
@GetMapping("/get")
public Object get() throws IOException {
	//1.创建请求,指定索引、文档id(索引的名字)
	GetRequest request = new GetRequest("indexdocument").id("6").type("_doc");
	GetResponse getResponse = restHighLevelClient.get(request, RequestOptions.DEFAULT);
	System.out.println(getResponse);//获取响应结果
	//getResponse.getSource() 返回的是Map集合
	System.out.println(getResponse.getSourceAsString());//获取响应结果source中内容,转化为字符串
	return getResponse;
}

3、更新文档中的数据

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

/**
 * 更新文档数据
 *
 * @return
 * @throws IOException
 */
@GetMapping("/update")
public Object update() throws IOException {
	//1.创建请求,指定索引、文档id(索引的名字)
	UpdateRequest request = new UpdateRequest("indexdocument","_doc","6");

	User user = new User("小明", 21);
	//将创建的对象放入文档中
	request.doc(JSON.toJSONString(user), XContentType.JSON);
	UpdateResponse updateResponse = restHighLevelClient.update(request, RequestOptions.DEFAULT);
	System.out.println(updateResponse.status());//更新成功返回OK
	return updateResponse;
}

3、删除文档中的数据

/**
 * 删除文档数据
 *
 * @return
 * @throws IOException
 */
@GetMapping("/delete")
public Object delete() throws IOException {
	//1.创建删除文档请求
	DeleteRequest request = new DeleteRequest("indexdocument").id("6").type("_doc");
	DeleteResponse deleteResponse = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
	System.out.println(deleteResponse.status());//更新成功返回OK
	return deleteResponse;
}

4、批量新增文档中的数据

/**
 * 批量新增文档数据
 *
 * @return
 * @throws IOException
 */
@GetMapping("/addBatch")
public Object addBatch() throws IOException {
	BulkRequest bulkRequest = new BulkRequest();
	//设置超时
	bulkRequest.timeout("10s");

	List<User> list = new ArrayList<>();
	list.add(new User("李四", 25));
	list.add(new User("王五", 18));
	list.add(new User("赵六", 30));
	list.add(new User("田七", 26));
	list.add(new User("刘八", 20));

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

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

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

/**
 * 复杂的es查询
 * @return
 * @throws IOException
 */
@GetMapping("test")
public Object test() throws IOException {
	SearchRequest searchRequest = new SearchRequest("indexdocument");//里面可以放多个索引
	SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();//构造搜索条件
	//此处可以使用QueryBuilders工具类中的方法
	//1.查询所有
	sourceBuilder.query(QueryBuilders.matchAllQuery());
	//2.查询name中含有Java的
	sourceBuilder.query(QueryBuilders.multiMatchQuery("张三", "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());
	//输出结果数据(如果不设置返回条数,大于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());
		}
	}
	return searchResponse;
}

总结

1.大致流程

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

2.注意事项

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

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

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

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

文章参考:https://blog.csdn.net/zhiyikeji/article/details/128902860

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

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

相关文章

都说测试行业饱和了,为啥我们公司给初级测试还能开到了12K?

故事起因&#xff1a; 最近我有个刚毕业的学生问我说&#xff1a;我感觉现在测试行业已经饱和了&#xff0c;也不是说饱和了&#xff0c;是初级的测试根本就没有公司要&#xff0c;哪怕你不要工资也没公司要你&#xff0c;测试刚学出来&#xff0c;没有任何的项目经验和工作经验…

2023年门店管理系统如何选?简单好用的门店管理系统有哪些?

开单收银效率低、商品管理混乱、记账对账耗时耗力还易出错...... 是我们在进行门店管理过程中常见的问题。 为了改善门店管理遇到的这几大问题&#xff0c;提高门店管理效率&#xff0c;越来越多的门店开始使用门店管理系统。 但如何选择简单实用、性价比高的门店管理系统&…

肠道核心菌属——Lachnoclostridium

谷禾健康 Lachnoclostridium属是一类革兰氏阳性菌&#xff0c;专性厌氧、形成孢子、属于Clostridiales目、Lachnospiraceae科、Firmicutes门。该属最初被描述为Clostridium phytofermentans&#xff0c;后来被重新分类为Lachnoclostridium属。 Lachnoclostridium属包括来自Lach…

00后真的是内卷王中王,真的想离职了....

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;前段时间我们公司来了个00年的&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。…

微服务通讯:gRPC入门教程

微服务通讯&#xff1a;个、RPC入门教程 gRPC是一个RPC框架&#xff0c;用于服务器之间服务的相互通讯&#xff0c;常见微服务项目开发中。市面上的RPC有很多&#xff0c;例如&#xff1a;dubbo、SpringCloud底层封装的等 1 概念 1.1 gRPC gRPC是一个高性能、开源的通用RPC&am…

计算机组成原理主要问题汇总(五)

一、定点数的原码、补码、反码和移码的表示和相互转换方法 1、原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位&#xff08;即最高位为符号位&#xff09;&#xff1a;正数该位为0&#xff0c;负数该位为1&#xff08;0有两种…

JavaEE(系列5) -- 多线程带来的风险(线程安全)

我们直接给出含有一个bug的例子 创建两个线程&#xff0c;各执行5w次自增。正常情况&#xff0c;结果是10w。 初始代码如下: package threading; //线程不安全 class Counter{private int count0;public void add(){count;}public int get(){return count;} } public class Th…

【项目实训】ATM自助取款系统

文章目录 1. 课程设计目的2. 课程设计任务与要求3. 课程设计说明书3.1 需求分析3.1.1 功能分析3.1.2 性能要求分析 3.2 概要设计3.2.1 功能模块图 3.3 详细设计3.3.1 实体类的设计3.3.2 实现数据库处理 3.4 主要程序功能流程图 4. 课程设计成果4.1 完整代码4.2 运行结果4.2.1 精…

最常用的开源免费自动化测试工具整理汇总 ,总有一款适合你

目录 1、Selenium 2、JMeter 3、Appium 4、Soapui 5、Postman 6、Robot Framework 7、Monkey 8、GT 9、Appscan 10、Jenkins 1、Selenium 官网&#xff1a; WebUI自动化测试 Selenium是一个用于Web应用程序测试的工具&#xff0c;Selenium已经成为Web自动化测试工程…

SpringCloud源码探析(六)-消息队列RabbitMQ

1.概述 RabbitMQ是一个开源的消息代理和队列服务器&#xff0c;它是基于Erlang语言开发&#xff0c;并且是基于AMQP协议的。由于Erlang语言最初使用与交换机领域架构&#xff0c;因此使得RabbitMQ在Broker之间的数据交互具有良好的性能。AMQP(Advanced Message Queuing Protoc…

路径规划算法:基于多元宇宙算法的路径规划算法- 附代码

路径规划算法&#xff1a;基于多元宇宙优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于多元宇宙优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

【Unity Optimize】使用对象池(Object Pooling)优化项目

目录 1 对象池&#xff08;Object Pooling&#xff09;介绍2 实现对象池脚本3 使用对象池生成Cube4 效果展示5 Unity资源商店的对象池插件 1 对象池&#xff08;Object Pooling&#xff09;介绍 Unity中的对象池&#xff08;Object Pooling&#xff09;是一种用于提高游戏性能…

教程详解|如何在PICO眼镜中接入VR全景?

伴随着《万人狂欢泼水节》首场VR直播开启&#xff0c;PICO视频正式推出《跟着PICO去旅行》系列VR文旅直播节目&#xff0c;通过PICO眼镜结合VR技术向众多观众展现更多祖国的大好山河&#xff0c;通过PICO眼镜身临其境地感受云游世界的美妙。 经历了十余年的发展&#xff0c;VR…

esp32环境安装教程---arduino IDE

前言 &#xff08;1&#xff09;最近突然对esp32感兴趣了&#xff0c;源于逛油管的时候&#xff0c;总是看到很多大佬使用esp32cam进行网络图传&#xff0c;做摄像头。个人比较感兴趣&#xff0c;在环境安装过程遇到了很多坑&#xff0c;所以在此跟大家分享一下。 &#xff08;…

了解ChatGPT的最便捷有效方式是跟对人

毕业后&#xff0c;工作原因&#xff0c;我自己的CSND就没有更新过。现在更新一篇有关chatGPT的快速入门指南。 一、什么是chatGPT 2022年12月底&#xff0c;你问我这个问题&#xff0c;我还真得好好跟你解释一下。目前这个阶段的火热程度&#xff0c;这里不再啰嗦了。基于GPT…

AI时代的赚钱思路:23岁女网红如何利用AI技术年入4亿?

一、AI技术为网红赚钱创造新途径 23岁美国网红Caryn Marjorie&#xff08;卡琳玛乔丽&#xff09;正同时交往1000多个男朋友。 作为一个在Snapchat上坐拥180万粉丝的美女&#xff0c;她利用人工智能&#xff08;AI&#xff09;技术&#xff0c;打造了一个AI版本的自己&#x…

鲲鹏昇腾开发者峰会开幕 星辰天合发布新一代天合翔宇一体机

近日&#xff0c;主题为“创未来 享非凡”的鲲鹏昇腾开发者峰会 2023 在东莞松山湖开幕&#xff0c;此次大会旨在帮助开发者深入了解鲲鹏、昇腾全栈技术&#xff0c;加速行业数智化的技术、产品和解决方案创新。 作为鲲鹏生态重要合作伙伴&#xff0c;XSKY星辰天合获邀参加此次…

【利用AI让知识体系化】入门Koa框架

思维导图 文章目录 思维导图一、介绍Koa什么是KoaKoa的历史Koa的特点 二、基本使用安装KoaHello World中间件路由错误处理 三、进阶使用静态资源管理Session管理文件上传表单处理HTTPS支持 四、Koa中间件中间件的概念Koa的洋葱模型常用中间件的介绍自定义中间件的编写 五、异步…

这个水平来面试也敢要20K?还是3年经验的测试工程师....

起因 老板觉得现在公司部门里都是男的&#xff0c;缺少一点阴柔之气&#xff0c;想平衡一下&#xff0c;正巧当时互联网公司倒了一大批&#xff0c;大批简历投到公司&#xff0c;老板以为自己也是技术出身&#xff0c;就想着要招了一个三年工作经验的女测试员&#xff0c;要价…

ANR实战案例1 - Google广告导致ANR解决

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言一、AdLoader$Builder广告构建ANR二、AdView布局动态创建案例总结 前言 一、AdLoa…