当前位置:   article > 正文

袁庭新ES系列15节|Elasticsearch客户端基础操作

袁庭新ES系列15节|Elasticsearch客户端基础操作

前言

上一章节我们介绍了搭建Elasticsearch集群相关的知识。那么又该如何来操作Elasticsearch集群呢?在ES官网中提供了各种语言的客户端,我们在项目开发过程中有多种Elasticsearch版本和连接客户端可以选择,那么他们有什么区别?这一章节袁老师带领大家来学习Elasticsearch客户端相关的内容。

一. ES客户端介绍

在Elasticsearch官网中提供了各种语言的客户端:Elasticsearch Clients | Elastic


客户端

优点

缺点

说明

Java Low Level Rest Client

与ES版本之间没有关系,适用于作为所有版本ES的客户端

低级别的REST客户端,通过HTTP与集群交互,用户需自己编组请求JSON串,及解析响应JSON串

不建议使用

Java High Level Rest Client

官方推出的,版本与ES同步更新

使用的版本需要保持和ES服务端的版本一致,否则会有版本问题

强烈推荐使用。基于Low Level Rest Client,它提供了更多的接口。注意:7.15版本之后将被弃用

TransportClient

启动速度快,轻量级,可创建极多连接,与应用程序解耦;推荐使用原生的,ES本身就很简单,灵活性很高

JAR包版本需与ES集群版本一致,ES集群升级,客户端也跟着升级到相同版本

不建议使用。过时产品,7版本之后不再支持

Elasticsearch Java API Client

最新的ES客户端。Elasticsearch Java API Client通过API的方式来组装请求数据,避免直接编写JSON字符串

文档少

使用人较少

注意点击进入后,选择版本到6.2.4版本 ,因为我们之前按照的都是6.2.4版本讲解的。进入后可以通过官方文档了解和学习Java客户端相关的知识。

二. 搭建工程环境

1.创建一个Spring Initalizr类型的项目,项目名称设置为【es-client】。

2.创建项目时,勾选Lombok、Spring Boot DevTools和Spring Web依赖。

注意:这里我们直接导入了SpringBoot的启动器,方便后续讲解。

3.将resource目录下自动生成的application.properties文件修改成application.yml。

4.在项目的pom.xml文件中手动引入Elasticsearch的High-level-Rest-Client等相关的依赖。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.7.6</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.yx</groupId>
  12. <artifactId>es-client</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>es-client</name>
  15. <description>es-client</description>
  16. <properties>
  17. <java.version>11</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-web</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-devtools</artifactId>
  27. <scope>runtime</scope>
  28. <optional>true</optional>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.projectlombok</groupId>
  32. <artifactId>lombok</artifactId>
  33. <optional>true</optional>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.springframework.boot</groupId>
  37. <artifactId>spring-boot-starter-test</artifactId>
  38. <scope>test</scope>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-starter-logging</artifactId>
  43. </dependency>
  44. <dependency>
  45. <groupId>com.google.code.gson</groupId>
  46. <artifactId>gson</artifactId>
  47. <version>2.8.5</version>
  48. </dependency>
  49. <dependency>
  50. <groupId>org.apache.commons</groupId>
  51. <artifactId>commons-lang3</artifactId>
  52. <version>3.8.1</version>
  53. </dependency>
  54. <!-- Apache开源组织提供的用于操作Java Bean的工具包 -->
  55. <dependency>
  56. <groupId>commons-beanutils</groupId>
  57. <artifactId>commons-beanutils</artifactId>
  58. <version>1.9.1</version>
  59. </dependency>
  60. <!-- ES高级Rest Client -->
  61. <dependency>
  62. <groupId>org.elasticsearch.client</groupId>
  63. <artifactId>elasticsearch-rest-high-level-client</artifactId>
  64. <version>6.4.3</version>
  65. </dependency>
  66. <dependency>
  67. <groupId>org.elasticsearch</groupId>
  68. <artifactId>elasticsearch</artifactId>
  69. <version>6.4.3</version>
  70. </dependency>
  71. <dependency>
  72. <groupId>junit</groupId>
  73. <artifactId>junit</artifactId>
  74. <version>4.13.2</version>
  75. <scope>test</scope>
  76. </dependency>
  77. </dependencies>
  78. <build>
  79. <plugins>
  80. <plugin>
  81. <groupId>org.springframework.boot</groupId>
  82. <artifactId>spring-boot-maven-plugin</artifactId>
  83. <configuration>
  84. <excludes>
  85. <exclude>
  86. <groupId>org.projectlombok</groupId>
  87. <artifactId>lombok</artifactId>
  88. </exclude>
  89. </excludes>
  90. </configuration>
  91. </plugin>
  92. </plugins>
  93. </build>
  94. </project>

三. 索引库及映射

创建索引库的同时,我们也会创建type及其映射关系,但是这些操作不建议使用Java客户端完成,原因如下:

  • 索引库和映射往往是初始化时完成,不需要频繁操作,不如提前配置好。
  • 官方提供的创建索引库及映射API非常繁琐,需要通过字符串拼接JSON结构。

因此,这些操作建议还是使用我们之前学习的Rest风格API去实现。

在项目的com.yx.pojo包下创建Product商品类,以这样一个商品数据为例来创建索引库。

  1. package com.yx.pojo;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. @Data
  6. @NoArgsConstructor
  7. @AllArgsConstructor
  8. public class Product {
  9. private Long id; // 主键
  10. private String title; // 标题
  11. private String category; // 分类
  12. private String brand; // 品牌
  13. private Double price; // 价格
  14. private String images; // 图片地址
  15. }

分析一下数据结构:

属性

描述

id

可以认为是主键,将来判断数据是否重复的标识,不分词,可以使用keyword类型

title

搜索字段,需要分词,可以用text类型

category

商品分类,这个是整体,不分词,可以使用keyword类型

brand

品牌,与分类类似,不分词,可以使用keyword类型

price

价格,这个是double类型

images

图片,用来展示的字段,不搜索,index为false,不分词,可以使用keyword类型

使用Kibana控制台向集群中创建yx索引库并编写映射配置(如果之前创建过yx索引库则先删除)。

  1. PUT /yx
  2. {
  3. "settings": {
  4. "number_of_shards": 3,
  5. "number_of_replicas": 1
  6. },
  7. "mappings": {
  8. "product": {
  9. "properties": {
  10. "id": {
  11. "type": "keyword"
  12. },
  13. "title": {
  14. "type": "text",
  15. "analyzer": "ik_max_word"
  16. },
  17. "category": {
  18. "type": "keyword"
  19. },
  20. "brand": {
  21. "type": "keyword"
  22. },
  23. "price": {
  24. "type": "double"
  25. },
  26. "images": {
  27. "type": "keyword",
  28. "index": false
  29. }
  30. }
  31. }
  32. }
  33. }

四. 索引数据操作

有了索引库之后,我们接下来看看如何对索引库中的数据进行增删改查操作。操作MySQL数据库:

1.获取数据库连接。

2.完成数据的增删改查操作。

3.释放资源。

1.初始化客户端

对索引库做任何操作,都需要通过RestHighLevelClient客户端来完成。

1.在项目的test测试文件夹下创建com.yx.es包,并在该包下创建一个ElasticsearchTests测试类。

2.然后在ElasticsearchTests类中编写RestHighLevelClient客户端的初始化方法init()和关闭方法close()。

  1. package com.yx.es;
  2. import com.google.gson.Gson;
  3. import org.apache.http.HttpHost;
  4. import org.elasticsearch.client.RestClient;
  5. import org.elasticsearch.client.RestClientBuilder;
  6. import org.elasticsearch.client.RestHighLevelClient;
  7. import org.junit.After;
  8. import org.junit.Before;
  9. import org.springframework.boot.test.context.SpringBootTest;
  10. import java.io.IOException;
  11. @SpringBootTest
  12. public class ElasticsearchTests {
  13. private RestHighLevelClient restHighLevelClient;
  14. // JSON工具
  15. private Gson gson = new Gson();
  16. /** 初始化客户端 */
  17. @Before
  18. public void init() {
  19. RestClientBuilder restClientBuilder = RestClient.builder(
  20. new HttpHost("127.0.0.1", 9201, "http"),
  21. new HttpHost("127.0.0.1", 9202, "http"),
  22. new HttpHost("127.0.0.1", 9203, "http")
  23. );
  24. restHighLevelClient = new RestHighLevelClient(restClientBuilder);
  25. }
  26. /** 关闭客户端 */
  27. @After
  28. public void close() throws IOException {
  29. // 关闭客户端
  30. restHighLevelClient.close();
  31. }
  32. }

2.新增文档

新增文档的实现是,先将数据封装到POJO对象中,然后通过restHighLevelClient对象来向索引库中新增数据。

2.1.新增文档实现

1.在ElasticsearchTests类中编写新增文档的insert()方法。

  1. /** 新增文档 */
  2. @Test
  3. public void insert() throws IOException {
  4. // 1.文档数据
  5. Product product = new Product();
  6. product.setId(1L);
  7. product.setTitle("华为P60震撼发布");
  8. product.setCategory("手机");
  9. product.setBrand("华为");
  10. product.setPrice(6999.99);
  11. product.setImages("http://image.huawei.com/1.jpg");
  12. // 2.将文档数据转换为JSON格式
  13. String source = gson.toJson(product);
  14. // 3.创建索引请求对象,访问哪个索引库、哪个type、指定文档ID
  15. IndexRequest request = new IndexRequest("yx", "product", product.getId().toString());
  16. request.source(source, XContentType.JSON);
  17. // 4.发送请求
  18. IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
  19. System.err.println(response);
  20. }

2.运行insert()方法,输出结果见下:

IndexResponse[index=yx,type=product,id=1,version=2,result=updated,seqNo=1,primaryTerm=1,shards={"total":2,"successful":2,"failed":0}]

3.运行insert()方法可能会报错,具体解决方案见下。

2.2.新增文档异常

1.如果导入Elasticsearch依赖时不指定其版本,可能导致找不到XContentType类。解决的方案就是在pom.xml文件中手动添加Elasticsearch对应版本的依赖,比如手动指定Elasticsearch的版本为6.4.3。如果没有这个问题,则忽略此步骤。

  1. <dependency>
  2. <groupId>org.elasticsearch</groupId>
  3. <artifactId>elasticsearch</artifactId>
  4. <version>6.4.3</version>
  5. </dependency>

2.如果运行insert()方法提示java.lang.NullPointerException空指针异常,则可能的原因是@Test注解的包导入错误,注意导入的包是org.junit.Test而非org.junit.jupiter.api.Test。

3.查看文档

根据Rest风格,查看文档是根据文档id进行GET查询操作,难点是对结果的解析。

1.在ElasticsearchTests类中编写查看文档的select()方法。

  1. /** 查看文档 */
  2. @Test
  3. public void select() throws IOException {
  4. // 创建GET请求并指定id
  5. GetRequest request = new GetRequest("yx", "product", "1");
  6. // 查询,得到响应
  7. GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
  8. // 获得响应结果数据
  9. String source = response.getSourceAsString();
  10. // 转化为JSON数据
  11. Product product = gson.fromJson(source, Product.class);
  12. System.err.println(product);
  13. }

2.运行select()方法,输出结果见下:

Product(id=1, title=华为P60震撼发布, category=手机, brand=华为, price=6999.99, images=http://image.huawei.com/1.jpg)

4.修改文档

新增文档时,如果传递的id是已经存在的,则会完成修改文档操作,如果id不存在,则是新增文档操作。

1.在ElasticsearchTests类中编写修改文档的update()方法。

  1. /** 修改文档 */
  2. @Test
  3. public void update() throws IOException {
  4. // 1.文档数据
  5. Product product = new Product();
  6. product.setId(1L); // id存在则为修改操作
  7. product.setTitle("华为P60直降1000");
  8. product.setPrice(5999.99);
  9. // 2.将文档数据转换为JSON格式
  10. String source = gson.toJson(product);
  11. // 3.创建索引请求对象,访问哪个索引库、哪个type、指定文档ID
  12. IndexRequest request = new IndexRequest("yx", "product", product.getId().toString());
  13. request.source(source, XContentType.JSON);
  14. // 4.发送请求
  15. IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
  16. System.err.println(response);
  17. }

2.运行update()方法,输出结果见下:

IndexResponse[index=yx,type=product,id=1,version=2,result=updated,seqNo=1,primaryTerm=1,shards={"total":2,"successful":2,"failed":0}]

5.删除文档

根据id删除文档。

1.在ElasticsearchTests类中编写删除文档的delete()方法。

  1. /** 删除文档 */
  2. @Test
  3. public void delete() throws IOException {
  4. // 准备删除的请求,参数为id
  5. DeleteRequest request = new DeleteRequest("yx", "product", "1");
  6. // 发起请求
  7. DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
  8. System.err.println(response);
  9. }

2.运行delete()方法,输出结果见下:

DeleteResponse[index=yx,type=product,id=1,version=3,result=deleted,shards=ShardInfo{total=2, successful=2, failures=[]}]

五. 结语

Elasticsearch客户端基础部分的内容袁老师就给大家介绍完了。回顾下这一章节我们学习的主要内容,介绍了ES客户端项目工程搭建、索引库及映射、索引数据操作,主要重点介绍了索引数据的增删改查操纵。关于ES客户端基础部分的内容就介绍到这里,下一章节袁老师带领大家学习Elasticsearch客户端高级操作部分的内容。

今天的内容就分享到这里吧。关注「袁庭新」,干货天天都不断!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/528696
推荐阅读
相关标签
  

闽ICP备14008679号