ES详细使用!Elasticsearch实现索引操作,增删改查,批处理

news/2024/9/18 12:06:29/ 标签: elasticsearch, 大数据, 搜索引擎

要想知道ES怎么具体实现对数据的操作,我们首先应该了解一下什么叫做restful编码风格,因为es的具体操作都是restful风格的。

1.RESTful风格

RESTful 是一种软件架构风格,用于创建可扩展的网络服务。它使用 HTTP 方法(如 GET、POST、PUT、DELETE)来执行 CRUD 操作(创建、读取、更新、删除)。RESTful API 通常具有以下特征:

资源导向:所有内容都是资源,每个资源都有唯一的 URI。
无状态:每个请求都是独立的,服务器不存储客户端的状态。
使用标准方法:使用 HTTP 动词来表示操作。
可缓存:响应可以被客户端缓存以提高性能。

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.*;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.springframework.web.bind.annotation.*;import java.util.Map;@RestController
@RequestMapping("/api/documents")
public class DocumentController {private final ElasticsearchClient client;public DocumentController() {RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();RestClientTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());this.client = new ElasticsearchClient(transport);}@PostMapping("/{indexName}/{docId}")public String addDocument(@PathVariable String indexName, @PathVariable String docId, @RequestBody Map<String, Object> document) throws Exception {client.index(i -> i.index(indexName).id(docId).document(document));return "Document added.";}@GetMapping("/{indexName}/{docId}")public Map<String, Object> getDocument(@PathVariable String indexName, @PathVariable String docId) throws Exception {GetResponse<Map<String, Object>> response = client.get(g -> g.index(indexName).id(docId), Map.class);return response.source();}@DeleteMapping("/{indexName}/{docId}")public String deleteDocument(@PathVariable String indexName, @PathVariable String docId) throws Exception {client.delete(d -> d.index(indexName).id(docId));return "Document deleted.";}
}
  • URI 设计:API 路径如 /api/documents/{indexName}/{docId} 用于操作特定索引和文档。
  • HTTP 方法:使用 @PostMapping@GetMapping@DeleteMapping 分别处理创建、读取和删除操作。
  • 依赖注入:通过构造函数创建 Elasticsearch 客户端实例。

2.ES的具体操作

2.1添加具体依赖

 在pom.xml里面添加下面的依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.4.0</version>
</dependency>

2.2控制器代码

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.*;
import co.elastic.clients.elasticsearch.core.bulk.*;
import co.elastic.clients.elasticsearch.indices.*;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.springframework.web.bind.annotation.*;import java.util.List;
import java.util.Map;@RestController
@RequestMapping("/api")
public class ElasticsearchController {private final ElasticsearchClient client;public ElasticsearchController() {RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();RestClientTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());this.client = new ElasticsearchClient(transport);}// 创建索引@PostMapping("/index/{indexName}")public String createIndex(@PathVariable String indexName) throws Exception {CreateIndexResponse response = client.indices().create(c -> c.index(indexName));return response.acknowledged() ? "Index created." : "Index creation failed.";}// 删除索引@DeleteMapping("/index/{indexName}")public String deleteIndex(@PathVariable String indexName) throws Exception {DeleteIndexResponse response = client.indices().delete(d -> d.index(indexName));return response.acknowledged() ? "Index deleted." : "Index deletion failed.";}// 添加文档@PostMapping("/document/{indexName}/{docId}")public String addDocument(@PathVariable String indexName, @PathVariable String docId, @RequestBody Map<String, Object> document) throws Exception {client.index(i -> i.index(indexName).id(docId).document(document));return "Document added.";}// 获取文档@GetMapping("/document/{indexName}/{docId}")public Map<String, Object> getDocument(@PathVariable String indexName, @PathVariable String docId) throws Exception {GetResponse<Map<String, Object>> response = client.get(g -> g.index(indexName).id(docId), Map.class);return response.source();}// 删除文档@DeleteMapping("/document/{indexName}/{docId}")public String deleteDocument(@PathVariable String indexName, @PathVariable String docId) throws Exception {client.delete(d -> d.index(indexName).id(docId));return "Document deleted.";}// 批量插入文档@PostMapping("/bulk/{indexName}")public String bulkInsert(@PathVariable String indexName, @RequestBody List<Map<String, Object>> documents) throws Exception {BulkRequest.Builder br = new BulkRequest.Builder();for (int i = 0; i < documents.size(); i++) {br.operations(op -> op.index(idx -> idx.index(indexName).id(String.valueOf(i)).document(documents.get(i))));}BulkResponse result = client.bulk(br.build());return result.errors() ? "Bulk insert had errors." : "Bulk insert completed.";}
}

2.2.1控制器类 

@RestController
@RequestMapping("/api")
public class ElasticsearchController {

 @RestController:标记这个类为一个 RESTful 控制器。
@RequestMapping("/api"):为所有方法定义基础路径 /api。

2.2.2Elasticsearch 客户端初始化

private final ElasticsearchClient client;public ElasticsearchController() {RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();RestClientTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());this.client = new ElasticsearchClient(transport);
}

创建一个 ElasticsearchClient 实例,用于与 Elasticsearch 通信。

连接到本地运行的 Elasticsearch 实例(localhost:9200)。 这里的localhost可以修改成服务器地址

2.2.3创建索引

@PostMapping("/index/{indexName}")
public String createIndex(@PathVariable String indexName) throws Exception {CreateIndexResponse response = client.indices().create(c -> c.index(indexName));return response.acknowledged() ? "Index created." : "Index creation failed.";
}

@PostMapping("/index/{indexName}"):处理 POST 请求,路径中包含索引名称。

使用 client.indices().create() 创建索引。

返回创建结果。

2.2.4删除索引

@DeleteMapping("/index/{indexName}")
public String deleteIndex(@PathVariable String indexName) throws Exception {DeleteIndexResponse response = client.indices().delete(d -> d.index(indexName));return response.acknowledged() ? "Index deleted." : "Index deletion failed.";
}

 @DeleteMapping("/index/{indexName}"):处理 DELETE 请求,路径中包含索引名称。

使用 client.indices().delete() 删除索引。

返回删除结果。

2.2.5添加文档

@PostMapping("/document/{indexName}/{docId}")
public String addDocument(@PathVariable String indexName, @PathVariable String docId, @RequestBody Map<String, Object> document) throws Exception {client.index(i -> i.index(indexName).id(docId).document(document));return "Document added.";
}

 @PostMapping("/document/{indexName}/{docId}"):处理 POST 请求,包含索引名称和文档 ID。

@RequestBody Map<String, Object> document:从请求体中获取文档内容。

使用 client.index() 添加文档。

2.2.6获取文档

@GetMapping("/document/{indexName}/{docId}")
public Map<String, Object> getDocument(@PathVariable String indexName, @PathVariable String docId) throws Exception {GetResponse<Map<String, Object>> response = client.get(g -> g.index(indexName).id(docId), Map.class);return response.source();
}

@GetMapping("/document/{indexName}/{docId}"):处理 GET 请求,路径中包含索引名称和文档 ID。

使用 client.get() 获取文档,返回文档内容。

 2.2.7删除文档

@DeleteMapping("/document/{indexName}/{docId}")
public String deleteDocument(@PathVariable String indexName, @PathVariable String docId) throws Exception {client.delete(d -> d.index(indexName).id(docId));return "Document deleted.";
}

@DeleteMapping("/document/{indexName}/{docId}"):处理 DELETE 请求,路径中包含索引名称和文档 ID。

使用 client.delete() 删除文档。

2.2.8批量插入文档

@PostMapping("/bulk/{indexName}")
public String bulkInsert(@PathVariable String indexName, @RequestBody List<Map<String, Object>> documents) throws Exception {BulkRequest.Builder br = new BulkRequest.Builder();for (int i = 0; i < documents.size(); i++) {br.operations(op -> op.index(idx -> idx.index(indexName).id(String.valueOf(i)).document(documents.get(i))));}BulkResponse result = client.bulk(br.build());return result.errors() ? "Bulk insert had errors." : "Bulk insert completed.";
}

@PostMapping("/bulk/{indexName}"):处理 POST 请求,路径中包含索引名称。

@RequestBody List<Map<String, Object>> documents:从请求体中获取多个文档。

使用 BulkRequest.Builder 进行批量操作。

返回批量插入结果。

2.3启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class ElasticsearchApplication {public static void main(String[] args) {SpringApplication.run(ElasticsearchApplication.class, args);}
}

3.总结

索引操作:使用 POST 和 DELETE 方法创建和删除索引。
文档操作:使用 POST、GET 和 DELETE 方法进行文档的添加、读取和删除。
批处理:通过 POST 方法实现批量插入文档。
依赖注入:通过构造函数创建 Elasticsearch 客户端实例。


http://www.ppmy.cn/news/1515885.html

相关文章

【系统架构设计师-2018年】案例分析-答案及详解

试题一&#xff08;25分&#xff09; 阅读以下关于软件系统设计的叙述&#xff0c;在答题纸上回答问题1至问题3。 【说明】 某文化产业集团委托软件公司开发一套文化用品商城系统&#xff0c;业务涉及文化用品销售、定制、竞拍和点评等板块&#xff0c;以提升商城的信息化建设…

【ORACLE】 ORA-01691: Lob 段无法通过 8192 (在表空间 XXX_SPACE 中) 扩展

ORA-01691错误通常表示Oracle数据库在尝试扩展LOB段时无法为表空间分配更多的空间。这个问题通常由表空间容量不足引起。根据搜索结果&#xff0c;以下是几种可能的解决方案&#xff1a; 检查并扩大表空间&#xff1a;首先&#xff0c;确认表空间是否已经达到其最大容量。可以使…

Excel中的“块”操作

在Excel中&#xff0c;有offset、index、indirect三个对“区域”操作的函数&#xff0c;是较高版本Excel中“块”操作的利器。 (笔记模板由python脚本于2024年08月20日 19:25:21创建&#xff0c;本篇笔记适合喜欢用Excel处理数据的coder翻阅) 【学习的细节是欢悦的历程】 Pytho…

HarmonyOs应用权限申请,system_grant和user_grant区别。本文附头像上传申请user-grant权限代码示例

HarmonyOs应用权限申请&#xff0c;system_grant和user_grant区别。本文附头像上传申请user-grant权限代码示例 system_grant&#xff08;系统授权&#xff09; system_grant指的是系统授权类型&#xff0c;在该类型的权限许可下&#xff0c;应用被允许访问的数据不会涉及到用户…

状态压缩DP---最短Hamilton路径

给定一张 nn 个点的带权无向图&#xff0c;点从 0∼n−10∼n−1 标号&#xff0c;求起点 00 到终点 n−1n−1 的最短 Hamilton 路径。 Hamilton 路径的定义是从 00 到 n−1n−1 不重不漏地经过每个点恰好一次。 输入格式 第一行输入整数 nn。 接下来 nn 行每行 nn 个整数&a…

火绒使用详解 为什么选择火绒?使用了自定义规则及其高级功能的火绒,为什么能吊打卡巴斯基,360,瑞星,惠普联想戴尔的电脑管家等?

目录 前言 必看 为什么选择火绒&#xff1f; 使用了自定义规则及其高级功能的火绒&#xff0c;为什么能吊打卡巴斯基&#xff0c;360&#xff0c;瑞星&#xff0c;惠普联想戴尔的电脑管家等&#xff1f; 原因如下&#xff1a; 火绒的主要优势 1. 轻量化设计 2. 强大的自…

wsl2 airsim wairing for connect (Windows11 UE4.27)问题解决

一、概述 这里记述我遇到我在使用wsl2子系统与Windows11上进行交互时候&#xff0c;遇到的一些我之前没有遇到过的问题。 之前的我写的配置链接在这里。 UE5 with plugins AirSim in Windows & ROS in WSL2-Ubuntu 20.04配置过程记录_airsim ue5-CSDN博客文章浏览阅读455次…

python循环访问excel的某一列从某行开始的内容

python循环访问excel的某一列从某一行开始的内容 您可以使用openpyxl库来实现这个需求。以下是一个示例代码&#xff0c;展示了如何使用openpyxl读取Excel文件中的特定列&#xff08;假设为第一列&#xff0c;从第二行开始&#xff09;&#xff1a; 可以使用Python的openpyxl…

FastAPI+Vue3零基础开发ERP系统项目实战课 20240824上课笔记 循环和函数以及大量的练习

巩固一下 假设我们现在想要根据输入月份&#xff0c;判断是哪个季节&#xff0c;怎么做呀&#xff1f; 输入1&#xff1a;一月&#xff0c;12月&#xff0c;1月&#xff0c;2月是冬季 输入8&#xff1a;八月&#xff0c;夏季 作为思考题&#xff0c;有时间就做一下&#xff…

【HTML】为网页添加列表和超链接

1、列表 1.1、无序列表 <ul><li>列表项1</li><li>列表项2</li><li>列表项3</li> ...... </ul>无序列表的常用type属性值 1.2、有序列表 <ol><li>列表项1</li><li>列表项2</li><li>列…

GGD光伏电站低压并网柜,分布式光伏并网配电柜

作为光伏低压并网柜的厂家之一&#xff0c;江苏中盟电气集团以下为您分享关于分布式光伏发电中用到的低压并网柜&#xff08;并网配电柜&#xff09;的内容。 实际上GGD光伏低压并网柜&#xff0c;只是众多型号并网柜中的一种&#xff0c;它们以低压交流配电柜为基础&#xff…

Linux-远程访问及控制

系列文章目录 提示&#xff1a;仅用于个人学习&#xff0c;进行查漏补缺使用。 1.Linux-网络设置 2.Linux-DHCP服务、vsftp 3.Linux-DNS域名解析服务 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录…

排查Maven问题的步骤

0.检查pom文件完整性 1.检查IDEA中配置是否正确 2.使用清楚工具将所有的lastupdate清除, 3.有些依赖是公司的依赖 —>配置私服 —>拷贝同事仓库,覆盖自己的仓库 4.有了私服地址,但是还是下载不到 —>查看地址是否能访问 —>挂VPN

ISP 3A 算法:自动曝光(AE)中的平均亮度法详解

在自动曝光&#xff08;AE&#xff09;算法中&#xff0c;平均亮度法是一种经典且广泛应用的技术。它通过计算场景中所有像素的平均亮度来确定最佳曝光设置&#xff0c;从而保证图像的整体亮度处于适当的水平。尽管该方法相对简单&#xff0c;但它在AE算法中扮演着重要的角色&a…

React+Vis.js(07):vis.js设置关系网络图禁止缩放和设置关系的指向和名称

文章目录 设置关系图禁止缩放设置关系图的关系指向和关系名称设置关系图的关系指向:方式一设置关系图的关系指向:方式二设置关系显示的标签设置关系图禁止缩放 在 vis.js 中,你可以通过设置 interaction 配置项中的 zoomView 属性为 false 来禁止缩放功能。这样,用户将无法…

SQL Server数据库 创建表,和表的增删改查

打开SQL Server工具,连接服务器 右击数据库&#xff0c;创建新的数据库 新建表 填写列&#xff0c;我添加了Id,Name,Sex,Age,和class列 右键表刷新一下就有了 我又同时创建了一个Class表 点击新建查询&#xff0c;现在写代码添加数据&#xff0c;也可以操作表来对数据进行添加 …

Vim youcompleteme Windows 安装保姆级教程

不说废话。 准备 检查 Vim 的 Python 配置 安装好 vim 和 python 后&#xff08;python 必须 ≥ \ge ≥ 3.6&#xff09;&#xff0c;在 cmd 下运行 vim --version会弹出以下窗口。 如果发现 python/dyn 和 python3/dyn 都是 - &#xff08;我不知道只有前者是 能不能运行…

日志审计-graylog ssh登录超过6次告警

Apt 设备通过UDP收集日志&#xff0c;在gray创建接收端口192.168.0.187:1514 1、ssh登录失败次数大于5次 ssh日志级别默认为INFO级别&#xff0c;通过系统rsyslog模块处理&#xff0c;日志默认存储在/var/log/auth.log。 将日志转发到graylog vim /etc/rsyslog.conf 文件末…

第133天:内网安全-横向移动域控提权NetLogonADCSPACKDC永恒之蓝

案例一&#xff1a;横向移动-系统漏洞-CVE-2017-0146 这个漏洞就是大家熟悉的ms17-010&#xff0c;这里主要学习cs发送到msf&#xff0c;并且msf正向连接后续 原因是cs只能支持漏洞检测&#xff0c;而msf上有很多exp可以利用 注意msf不能使用4.5版本的有bug 这里还是反弹权…

2 种方式申请免费 SSL 证书,阿里云 Certbot

如何使用免费的 SSL 证书&#xff0c;有时在项目中需要使用免费的 SSL 证书&#xff0c;Aliyun 提供免费证书&#xff0c;三个月有效期&#xff0c;可以直接在aliyun 申请&#xff0c;搜索 SSL 证书&#xff0c;选择测试证书。 Aliyun 证书需要每三月来来换一次&#xff0c;页…