八、HighLevelAPI
8.1、RestAPI介绍&项目导入
8.1.1、RestAPI介绍
- ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES
- 官方文档地址
- https://www.elastic.co/guide/en/elasticsearch/client/index.html
- 其中的Java Rest Client又包括两种
- Java Low Level Rest Client
- Java High Level Rest Client
本次学习的是HighLevel版本
8.1.2、项目导入
有需要的可以直接联系本人
①、数据库数据导入
- 导入自定义的数据即可;
②、创建初始工程
-
初始工程创建成功后,目录结构如下所示
- 其中
HotelDoc
后续会说到
- 其中
-
配置application.yml
-
在spring层级下添加es的服务端路径配置
-
elasticsearch: rest: uris: - http://192.168.222.135:9200
-
-
导入相关依赖
-
<?xml version=\"1.0\" encoding=\"UTF-8\"?> <project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd\"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.coolman.hotel</groupId> <artifactId>hotel-demo</artifactId> <name>hotel-demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <!--es的RestAPI依赖--> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
-
-
编写测试类,验证是否可以正常连接
-
package com.coolman.hotel.test; import lombok.extern.slf4j.Slf4j; import org.elasticsearch.client.RestHighLevelClient; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest @Slf4j public class TestConnectES { @Autowired private RestHighLevelClient restHighLevelClient; @Test public void testConnect() { log.info(restHighLevelClient + \"\"); } }
-
8.2、创建索引
-
代码如下所示
-
/** * 创建索引测试 */ @Test public void testCreateIndex() throws IOException { // 1. 获取索引操作对象 IndicesClient indicesClient = restHighLevelClient.indices(); // 2. 创建索引对象 CreateIndexRequest request = new CreateIndexRequest(\"hotel\");// 相当于DSL语句的 PUT hotel 请求,但是还没执行 // 3. 执行操作 CreateIndexResponse response = indicesClient.create(request, RequestOptions.DEFAULT); // 4. 获取结果 log.info(response.isAcknowledged() + \"\"); }
-
-
运行结果如下所示
-
Kibana验证
8.3、添加映射
-
代码如下所示
-
因为创建映射需要DSL语句,所以先在kibana编写如下语句
-
DELETE hotel GET hotel/_mapping # 分析hotel索引库的映射结构 # index属性:是否建立索引,默认值true,如果该字段不用查询,则设置false # copy_to: 把指定字段的值拷贝到另一个字段上 PUT hotel { \"mappings\": { \"properties\": { \"id\": { \"type\": \"keyword\" }, \"name\": { \"type\": \"text\", \"analyzer\": \"ik_smart\", \"copy_to\": \"all\" }, \"address\": { \"type\": \"text\", \"analyzer\": \"ik_smart\" }, \"price\": { \"type\": \"integer\" }, \"score\": { \"type\": \"integer\" }, \"brand\": { \"type\": \"keyword\", \"copy_to\": \"all\" }, \"city\": { \"type\": \"keyword\" }, \"starName\": { \"type\": \"keyword\" }, \"business\": { \"type\": \"keyword\", \"copy_to\": \"all\" }, \"location\": { \"type\": \"geo_point\" }, \"pic\": { \"type\": \"keyword\", \"index\": false }, \"isAD\": { \"type\": \"boolean\" }, \"all\": { \"type\": \"text\", \"analyzer\": \"ik_smart\" } } } }
-
-
创建成功后,再删除,将mappings中的字段复制到Java代码中
-
/** * 添加映射测试 */ @Test public void testAddMapping() throws IOException { // 1. 创建索引操作对象 IndicesClient indicesClient = restHighLevelClient.indices(); // 2. 创建索引 CreateIndexRequest request = new CreateIndexRequest(\"hotel\"); // 3. 定义mapping语句 String mapping = \"{\\n\" + \" \\\"properties\\\": {\\n\" + \" \\\"id\\\": {\\n\" + \" \\\"type\\\": \\\"keyword\\\"\\n\" + \" },\\n\" + \" \\\"name\\\": {\\n\" + \" \\\"type\\\": \\\"text\\\",\\n\" + \" \\\"analyzer\\\": \\\"ik_smart\\\",\\n\" + \" \\\"copy_to\\\": \\\"all\\\"\\n\" + \" },\\n\" + \" \\\"address\\\": {\\n\" + \" \\\"type\\\": \\\"text\\\",\\n\" + \" \\\"analyzer\\\": \\\"ik_smart\\\"\\n\" + \" },\\n\" + \" \\\"price\\\": {\\n\" + \" \\\"type\\\": \\\"integer\\\"\\n\" + \" },\\n\" + \" \\\"score\\\": {\\n\" + \" \\\"type\\\": \\\"integer\\\"\\n\" + \" },\\n\" + \" \\\"brand\\\": {\\n\" + \" \\\"type\\\": \\\"keyword\\\",\\n\" + \" \\\"copy_to\\\": \\\"all\\\"\\n\" + \" },\\n\" + \" \\\"city\\\": {\\n\" + \" \\\"type\\\": \\\"keyword\\\"\\n\" + \" },\\n\" + \" \\\"starName\\\": {\\n\" + \" \\\"type\\\": \\\"keyword\\\"\\n\" + \" },\\n\" + \" \\\"business\\\": {\\n\" + \" \\\"type\\\": \\\"keyword\\\",\\n\" + \" \\\"copy_to\\\": \\\"all\\\"\\n\" + \" },\\n\" + \" \\\"location\\\": {\\n\" + \" \\\"type\\\": \\\"geo_point\\\"\\n\" + \" },\\n\" + \" \\\"pic\\\": {\\n\" + \" \\\"type\\\": \\\"keyword\\\",\\n\" + \" \\\"index\\\": false\\n\" + \" },\\n\" + \" \\\"isAD\\\": {\\n\" + \" \\\"type\\\": \\\"boolean\\\"\\n\" + \" },\\n\" + \" \\\"all\\\": {\\n\" + \" \\\"type\\\": \\\"text\\\",\\n\" + \" \\\"analyzer\\\": \\\"ik_smart\\\"\\n\" + \" }\\n\" + \" }\\n\" + \" }\"; request.mapping(mapping, XContentType.JSON); // 设置mappings字段,并指定其内容为json格式 // 4. 执行操作 CreateIndexResponse response = indicesClient.create(request, RequestOptions.DEFAULT); // 5. 获取结果 log.info(response.isAcknowledged() + \"\"); }
-
-
-
运行结果如下所示
-
Kibana验证
8.4、删除索引
-
代码如下所示
-
/** * 删除索引测试 */ @Test public void testDeleteIndex() throws IOException { // 1. 获取索引操作对象 IndicesClient indicesClient = restHighLevelClient.indices(); // 2. 获取索引对象 DeleteIndexRequest request = new DeleteIndexRequest(\"hotel\"); // DELETE hotel // 3. 执行操作 AcknowledgedResponse response = indicesClient.delete(request, RequestOptions.DEFAULT); // 4. 获取结果 log.info(\"\" + response.isAcknowledged()); }
-
-
比较简单,自行验证即可
8.5、添加文档
-
代码如下所示
-
/** * 添加文档测试 */ // Jackson private ObjectMapper objectMapper = new ObjectMapper(); @Test public void testAddDocument() throws IOException { // 先获取 指定的 hotel数据 Hotel hotel = hotelMapper.selectById(36934); HotelDoc hotelDoc = new HotelDoc(hotel); // 1. 创建请求对象 IndexRequest request = new IndexRequest(\"hotel\").id(hotelDoc.getId().toString()); // 2. 填充文档内容 String json = objectMapper.writeValueAsString(hotelDoc); request.source(json, XContentType.JSON); // 3. 执行请求体对象 IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT); // 4. 获取结果 log.info(response.getId() + \"\"); }
-
-
Kibana验证
8.6、修改、查询、删除文档
8.6.1、修改文档
修改文档和添加文档操作一样,需要注意的是修改文档必须是已经存在的ID
-
代码如下所示
-
/** * 修改文档 */ @Test public void testUpdateDocument() throws IOException { // 1. 先获取 指定的 hotel 数据 Hotel hotel = hotelMapper.selectById(36934L); HotelDoc hotelDoc = new HotelDoc(hotel); // 2. 修改数据,如价格 hotelDoc.setPrice(1999999999); // 3. 将 hotelDoc 对象转换为 JSON格式的数据 String json = objectMapper.writeValueAsString(hotelDoc); // 4. 创建请求对象 IndexRequest request = new IndexRequest(\"hotel\").id(hotelDoc.getId().toString()); request.source(json, XContentType.JSON); // 5. 执行操作 IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT); log.info(response.getId()); }
-
-
Kibana验证
8.6.2、查询文档
-
代码如下所示
-
/** * 查询文档 */ @Test public void testSearchDocument() throws IOException { Long id = 36934L; // 1. 创建请求 GetRequest request = new GetRequest(\"hotel\").id(id.toString()); // 2. 执行请求 GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT); // 3. 取出结果 String hotelDocJson = response.getSourceAsString(); HotelDoc hotelDoc = objectMapper.readValue(hotelDocJson, HotelDoc.class); log.info(hotelDoc.toString()); }
-
-
运行结果如下所示
8.6.3、删除文档
-
代码如下所示
-
/** * 删除文档 */ @Test public void testDeleteDocument() throws IOException { Long id = 36934L; // 1. 创建请求 DeleteRequest request = new DeleteRequest(\"hotel\").id(id.toString()); // 2. 执行请求 DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT); log.info(response.getId()); }
-
-
Kibana验证
8.7、批量添加
-
Bulk
批量操作是将文档的增删改查一些列操作,通过一次请求全都做完。减少网络传输次数 -
应用场景
- ES索引库数据初始化的时候,可以将数据库的数据查询出来通过批量操作导入到索引库中
-
代码如下所示
-
/** * 批量添加文档 */ @Test public void testBatchAddDocument() throws IOException { // 1. 获取需要导入的数据 List<Hotel> hotelList = hotelMapper.selectList(null); if(CollectionUtils.isNotEmpty(hotelList)) { // 2. 创建批量操作请求对象 BulkRequest bulkRequest = new BulkRequest(); // 4. 获取文档映射的对象数据 for (Hotel hotel : hotelList) { HotelDoc hotelDoc = new HotelDoc(hotel); // 5. 创建请求对象 IndexRequest request = new IndexRequest(\"hotel\").id(hotelDoc.getId().toString());; // 6. 填充内容 String json = objectMapper.writeValueAsString(hotelDoc); request.source(json, XContentType.JSON); // 7. 将数据添加到批量操作对象中 bulkRequest.add(request); } // 8. 一次性执行批量操作 BulkResponse response = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT); log.info(response.status().toString()); } }
-
-
运行结果如下所示
-
Kibana验证
来源:https://www.cnblogs.com/OnlyOnYourself-lzw/p/16559764.html
本站部分图文来源于网络,如有侵权请联系删除。