springboot整合ES及其基本使用

news/2024/11/15 16:26:14/文章来源:https://www.cnblogs.com/LIang2003/p/18548178

Springboot整合ElasticSearch

导入依赖

        <dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>${elasticsearch.version}</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>${elasticsearch.version}</version></dependency>

注意一定要显示指定ES版本,因为Springboot自带ES的版本,而版本不匹配会引来其他问题

配置

在application.yml

elasticsearch:clusterName: eshosts: ES地址:9200scheme: httpconnectTimeOut: 1000 socketTimeOut: 30000connectionRequestTimeOut: 1000maxConnectNum: 100maxConnectNumPerRoute: 100# 有username和password就弄上去 

配置类

/*** restHighLevelClient 客户端配置类*/
@Slf4j
@Data
@Configuration
@ConfigurationProperties(prefix = "elasticsearch")
public class ElasticsearchConfig {// es host ip 地址(集群)private String hosts;// es用户名
//    private String userName;// es密码
//    private String password;// es 请求方式private String scheme;// es集群名称private String clusterName;// es 连接超时时间private int connectTimeOut;// es socket 连接超时时间private int socketTimeOut;// es 请求超时时间private int connectionRequestTimeOut;// es 最大连接数private int maxConnectNum;// es 每个路由的最大连接数private int maxConnectNumPerRoute;/*** 如果@Bean没有指定bean的名称,那么这个bean的名称就是方法名*/@Bean(name = "restHighLevelClient")public RestHighLevelClient restHighLevelClient() {// 此处为单节点esHttpHost httpHost = HttpHost.create(hosts);// 构建连接对象RestClientBuilder builder = RestClient.builder(httpHost);// 设置用户名、密码//CredentialsProvider credentialsProvider = new BasicCredentialsProvider();//credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials(userName,password));// 连接延时配置builder.setRequestConfigCallback(requestConfigBuilder -> {requestConfigBuilder.setConnectTimeout(connectTimeOut);requestConfigBuilder.setSocketTimeout(socketTimeOut);requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);return requestConfigBuilder;});// 连接数配置builder.setHttpClientConfigCallback(httpClientBuilder -> {httpClientBuilder.setMaxConnTotal(maxConnectNum);httpClientBuilder.setMaxConnPerRoute(maxConnectNumPerRoute);
//            httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);return httpClientBuilder;});return new RestHighLevelClient(builder);}
}

操作

通过RestHighLevelClient 类来操作,有个indices方法,可以执行创建索引库,文档的增删改查。

工具类

@Component
public class ESClient {@Autowiredprivate RestHighLevelClient restHighLevelClient;/*** 创建索引库* @param index 索引名* @param settings 设置的分片,备份分片数量* @param mappings 索引库的结构*/public boolean createIndex(String index, Settings.Builder settings, XContentBuilder mappings) throws IOException {CreateIndexRequest request = new CreateIndexRequest(index).settings(settings).mapping(mappings);return restHighLevelClient.indices().create(request, RequestOptions.DEFAULT).isAcknowledged();}/*** 创建索引* @param index* @param jsonMapping 索引库结构* @return* @throws IOException*/public CreateIndexResponse createIndex(String index, String jsonMapping) throws IOException {CreateIndexRequest request = new CreateIndexRequest(index);request.source(jsonMapping, XContentType.JSON);return restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);}/*** 删除索引库* @param index 索引库名*/public boolean deleteIndex(String index) throws IOException {DeleteIndexRequest deleteRequest = new DeleteIndexRequest(index);AcknowledgedResponse response = restHighLevelClient.indices().delete(deleteRequest, RequestOptions.DEFAULT);return response.isAcknowledged();}/*** 创建文档 指定id* @param index 索引* @param id 文档id* @param jsonString 文档内容*/public IndexResponse createDocument(String index, String id, String jsonString) throws IOException {IndexRequest request = new IndexRequest(index).id(id).source(jsonString, XContentType.JSON);return restHighLevelClient.index(request, RequestOptions.DEFAULT);}/*** 创建文档* @param index 索引* @param jsonString 文档内容*/public IndexResponse createDocument(String index, String jsonString) throws IOException {IndexRequest request = new IndexRequest(index).source(jsonString,XContentType.JSON);return restHighLevelClient.index(request, RequestOptions.DEFAULT);}/*** 获取文档* @param index 索引库* @param id 文档id*/public String getDocument(String index, String id) throws IOException {GetRequest request = new GetRequest(index, id);return restHighLevelClient.get(request, RequestOptions.DEFAULT).getSourceAsString();}/*** 删除文档* @param index 索引库名* @param id 文档id*/public boolean deleteDocument(String index, String id) throws IOException {DeleteRequest deleteRequest = new DeleteRequest(index, id);DocWriteResponse.Result result = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT).getResult();return result == DocWriteResponse.Result.DELETED;}/*** 更新文档* @param index 索引库名称* @param id 文档id* @param jsonString 更新的内容*/public UpdateResponse updateDocument(String index, String id, String jsonString) throws IOException {UpdateRequest request = new UpdateRequest(index, id).doc(jsonString, XContentType.JSON);return restHighLevelClient.update(request, RequestOptions.DEFAULT);}/*** 查询文档* @param index 索引库* @param query 查询条件*/public SearchResponse searchDocuments(String index, SearchSourceBuilder query) throws IOException {SearchRequest searchRequest = new SearchRequest(index);searchRequest.source(query);return restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);}/*** 批量插入,* @param index    索引库名* @param dataList <id,data>文档列表* @return*///批量插入public <T> BulkResponse bulkCreateDocument(String index, List<Pair<String,T>> dataList) throws IOException {BulkRequest request = new BulkRequest();for(Pair<String, T> pair : dataList){request.add(new IndexRequest(index).id(pair.getKey()).source(JSON.toJSONString(pair.getValue()), XContentType.JSON));}return restHighLevelClient.bulk(request, RequestOptions.DEFAULT);}/*** 批量删除* @param index  索引库名* @param idList 需要删除的文档id* @return*/public BulkResponse bulkDeleteDocument(String index, List<String> idList) throws IOException {BulkRequest request = new BulkRequest();for(String id : idList){request.add(new DeleteRequest(index, id));}return restHighLevelClient.bulk(request, RequestOptions.DEFAULT);}}

使用


@SpringBootTest
public class EsTest {@Autowiredprivate ESClient client;@Testpublic void createIndex() throws IOException {Settings.Builder settings = Settings.builder().put("number_of_shards", 5) //分片数量.put("number_of_replicas", 1); //备份分片数量//构造mappingsXContentBuilder mappings = JsonXContent.contentBuilder().startObject() //这个相当于{.startObject("properties") //当属性名相当于 properties:{.startObject("id").field("type", "long").endObject().startObject("title").field("type", "text").field("analyzer", "ik_max_word").endObject().startObject("price").field("type", "integer").endObject().endObject().endObject(); //这个相当于}System.out.println(mappings);boolean success = client.createIndex("goods", settings, mappings);System.out.println(success);}@Testpublic void deleteIndex() throws IOException {boolean success = client.deleteIndex("goods");System.out.println(success);}@Testpublic void createDocument() throws IOException {for(int i=1;i<=10;i++){Goods goods = new Goods((long) i,"goods_"+i,20.0);client.createDocument("goods",goods.getId().toString(), JSON.toJSONString(goods));}}@Testpublic void getDocument() throws IOException {String source = client.getDocument("goods", "2");System.out.println(source);}@Testpublic void updateDocument() throws IOException {Goods goods = new Goods(1L, "goods_3", 30.0);IndexResponse response = client.createDocument("goods", "3", JSON.toJSONString(goods));}@Testpublic void deleteDocument() throws IOException {boolean success = client.deleteDocument("goods", "3");System.out.println(success);}@Testpublic void queryDocument() throws IOException {//SearchSourceBuilder构造搜索条件SearchSourceBuilder queryBuilder = new SearchSourceBuilder();queryBuilder.query(QueryBuilders.termQuery("price", 20.0));SearchResponse response = client.searchDocuments("goods", queryBuilder);//返回的response有hit数组,而每个hit中的source才是我们关心的数据response.getHits().forEach(hit -> System.out.println(hit.getSourceAsMap()));}@Testpublic void getAllDocument() throws IOException {SearchSourceBuilder builder = new SearchSourceBuilder();builder.query(QueryBuilders.matchAllQuery());SearchResponse response = client.searchDocuments("goods", builder);response.getHits().forEach(hit -> System.out.println(hit.getSourceAsMap()));}@Testpublic void bulkCreateDocument() throws IOException {List<Pair<String,Goods>> list = new ArrayList<>();for(int i=11;i<=20;i++){Goods goods = new Goods((long) i, "goods_"+i, i*10.0);list.add(new Pair<>(String.valueOf(i),goods));}client.bulkCreateDocument("goods",list);}@Testpublic void bulkDeleteDocument() throws IOException {List<String> ids = new ArrayList<>();for(int i=11;i<=20;i++){ids.add(String.valueOf(i));}client.bulkDeleteDocument("goods", ids);}}

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

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

相关文章

js 日期遍历 小算法

js 日期遍历 小算法给一个完整月份日期 list ,怎样遍历出来 类似一个月 日历呢?勉强写了一个 基于vue<table><tbody><template v-for="n in 5"><tr><template v-for="w in 7"><template v-if="(w-1)+(n-1)*7 <…

2024-2025-1 20241322《计算机基础与程序设计》第八周学习总结

2024-2025-1 20241322 《计算机基础与程序设计》第八周学习总结 作业信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08这个作业的目标 功能设计与面向对象设计面向对…

echarts 画一个南丁格尔玫瑰饼图

const datas = [{name: 无信号,value: 5,label: { color: #06B7FFFF }},{name: 正常,value: 8,label: { color: #69D85DFF }},{name: 报警,value: 7,label: { color: #FA6400FF }},{name: 警告,value: 4,label: { color: #F7B500FF }} ]option = {tooltip: {trigger: item,form…

数字孪生技术:如何实现智能制造与城市管理的全新升级

在现代的数字化转型过程中,数字孪生技术成为许多行业实现智能化升级的重要推动力。而作为领先的可视化平台,山海鲸可视化通过其强大的鲸孪生组件,将数字孪生技术与可视化紧密结合,为企业和行业用户提供了一种全新的方式来管理、监控和优化复杂系统。下面我们将详细介绍山海…

【鸣潮,原神PC端启动器】仿二次元手游PC端游戏启动器,以鸣潮为例。

二游GAMELanucher启动器 1.前言许多二次元手游(原神,鸣潮,少女前线)的PC端启动器都是使用Qt做的,正好最近正在玩鸣潮,心血来潮,便仿鸣潮启动器,从头写一个。先下载一个官方版的PC启动器,找到图标,背景图等素材,然后对着界面写代码就行。效果如下2. 划分模块游戏启动…

css动态检测视口屏幕的尺寸

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>css动态检测屏幕的视口尺寸</title><…

自定义注解进行数据脱敏

前言 有些时候,我们可能对输出的某些字段要做特殊的处理在输出到前端,比如:身份证号,电话等信息,在前端展示的时候我们需要进行脱敏处理,这时候通过自定义注解就非常的有用了。在Jackson中要自定义注解,我们可以通过@JacksonAnnotationsInside注解来实现,如下示例: 一…

openVAS安装记

项目需要使用openVAS 安装步骤 我这里使用的是Ubuntu最新版,因为Ubuntu和debian可通过官网仓库进行安装,因改名为gvm 后续直接上操作 #安装 sudo apt install gvm -y #初始化(可能时间比较长,台会去下载数据库) sudo gvm-setup# 开机自启服务 sudo systemctl enable notus-…

爆火的外卖霸王餐项目,怎么做?

微客云以下是一些做爆火的外卖霸王餐项目的方法: ### 明确项目定位与目标- **确定核心目标**:明确是为了增加新用户、提高复购率、提升品牌知名度还是收集用户反馈等,不同目标决定后续策略 。- **精准定位用户群体**:了解目标用户的消费习惯、喜好、需求及消费能力等,如上…

轮廓线DP

讲解轮廓线DP的两种常见形式以及例题。更新日志概念 类似于状态压缩DP,但我们储存的是轮廓线上的状态。 有些时候,也不需要进行状态压缩,而可以用某一点的状态代表一个区域的状态。 思路 轮廓线就是已经决策的与尚未决策的部分的分界线,我们储存分界线上已经决策过的所有节…

Nuxt.js 应用中的 schema:written 事件钩子详解

title: Nuxt.js 应用中的 schema:written 事件钩子详解 date: 2024/11/15 updated: 2024/11/15 author: cmdragon excerpt: schema:written 钩子是 Vite 提供的一种生命周期钩子,在模式写入完成后调用。通过这个钩子,开发者可以在配置被正式应用之后执行一些后续操作,比如记…

概率与期望基础

实验、结果、样本空间、事件 事件 \(A\) 是否发生取决于一系列影响它的因素,这些因素影响 \(A\) 的过程称为一次 experiment 实验 或 trial 试验 一次试验的 result 结果 称为它的 outcome 结局。\(\text{result}\) 指由原因所引起的结果 \(\text{outcome}\) 强调事件特有的结…