当前位置:   article > 正文

高效的ElasticSearch Java API - my-elasticsearch-starter

高效的ElasticSearch Java API - my-elasticsearch-starter

   ES Java Api有很多种,本文主要是基于Spring Boot进行封装的,为什么选择Spring Boot,可以看往期文章 Elasticsearch入门必读指南:到底选择哪个ES版本更合适 。 Spring Boot现在也是Java生态中主流的开发框架使用最广泛,综上没有理由不使用,所以本文及提供的starter也以此为基础。

一、背景

虽然spring-boot-starter-data-elasticsearch已经对原生的ES Api进行了封装,但使用起来还是不够高效。ES作为一个搜索引擎中间件,一个企业内业很多业务团队都可能会使用到,封装一个通用的ES Starter供业务团队使用非常有必要。 通过该Starter可以降低业务团队接入及使用成本,也方便后续ES的统一升级管理。

二、高效的my-elasticsearch-starter

 my-elasticsearch-starter是基于Spring Boot Starter规范进行封装,基于Spring Boot的应用都可以快速引入使用。

该Starter在Github上开源,地址如下 :GitHub - caizi12/my-elasticsearch-starter: elasticsearch starter

 如果不方便访问的话,也可以下载压缩包

my-elasticsearch-starter.zip

my-elasticsearch-starter 对ES Api进行了封装,提供了更加简洁高效的API出来,对于有一点开发经验的来说使用该Starter可能10分钟就可以完成ES的接入及基本的Demo的开发。以下介绍整体Starter的使用方式。

 2.1 使用方式

    使用时可以先把代码Deploy到公司的私有仓库中,然后应用程序中依赖使用,如果没有私有仓库可以把代码copy到应用中使用。

     

2.1.1、应用添加依赖

  1. <dependency>
  2. <groupId>com.my.es</groupId>
  3. <artifactId>elasticsearch-starter</artifactId>
  4. <version>1.0.0-SNAPSHOT</version>
  5. </dependency>

2.1.2、应用添加ES链接配置

以下是properties格式,如果是Yml格式自行调整即可

  1. #es链接地址
  2. spring.elasticsearch.uris=http://localhost:9200
  3. #es账号密码,根据实际填写
  4. spring.elasticsearch.username=elastic
  5. spring.elasticsearch.password=123456
  6. #可省配置:连接es集群超时参数,默认毫秒
  7. spring.elasticsearch.connection-timeout=300
  8. spring.elasticsearch.read-timeout=300

以上两步完成后应用就已经接入了ES,接下来直接开发业务代码即可

3、ES API Demo,高效完成一个学生ES Demo

 3.1 定义索引对象

  定义一个学生索引对象,方便在代码中开发使用

  1. package com.my.es.test.model;
  2. import java.util.Date;
  3. import lombok.AllArgsConstructor;
  4. import lombok.Data;
  5. import lombok.NoArgsConstructor;
  6. import org.springframework.data.annotation.Id;
  7. import org.springframework.data.annotation.Version;
  8. import org.springframework.data.elasticsearch.annotations.Document;
  9. import org.springframework.data.elasticsearch.annotations.Field;
  10. import org.springframework.data.elasticsearch.annotations.FieldType;
  11. /**
  12. *
  13. * 学生索引
  14. * @authro nantian
  15. * @date 2022-09-28 15:34
  16. */
  17. @Data
  18. @AllArgsConstructor
  19. @Document(indexName = "index_student")
  20. //分片设置,一般不建议代码中创建索引,在Kibana中进行管理比较合适
  21. //@Setting(shards = 5,replicas = 1)
  22. @NoArgsConstructor
  23. public class Student {
  24. //索引主键
  25. @Id
  26. private long id;
  27. @Field(type = FieldType.Keyword)
  28. private String name;
  29. @Field(type = FieldType.Keyword)
  30. private String text;
  31. //@Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_smart")
  32. @Field(type = FieldType.Keyword)
  33. private String desc;
  34. //@Field(type = FieldType.Text,analyzer = "ik_smart")
  35. @Field(type = FieldType.Keyword)
  36. private String title;
  37. @Field(type = FieldType.Integer)
  38. private Integer age;
  39. @Field(type = FieldType.Date)
  40. private Date date;
  41. //版本号,可以解决数据冲突问题
  42. @Version
  43. private Long version;
  44. }

    3.2 增删改查

  1. @SpringBootTest
  2. public class MyEsServiceTest {
  3. @Autowired
  4. private MyEsService myEsService;
  5. //删除索引
  6. @Test
  7. public void delIndex() {
  8. boolean result = myEsService.deleteIndexIfExist(Student.class);
  9. Assert.assertTrue(result);
  10. }
  11. //更新索引结构
  12. @Test
  13. public void updateMapping() {
  14. boolean result = myEsService.updateIndexMapping(Student.class);
  15. Assert.assertTrue(result);
  16. }
  17. //创建学生索引
  18. @Test
  19. public void createIndex() {
  20. boolean exist = myEsService.existIndex(Student.class);
  21. boolean result = false;
  22. if (!exist) {
  23. result = myEsService.createIndexIfNotExist(Student.class);
  24. } else {
  25. System.out.println("index exist:" + Student.class.getName());
  26. }
  27. Assert.assertTrue(result);
  28. }
  29. //添加一个学生数据到索引中
  30. @Test
  31. public void addIndexDoc() {
  32. Student student = new Student(1000, "张三", "测试索引添加", "哈哈", "三年二班刘", 10, new Date(), null);
  33. String documentId = myEsService.addIndexDoc(student);
  34. System.out.println("addIndexDoc result:" + documentId);
  35. Assert.assertNotNull(documentId);
  36. }
  37. //更新一个学生数据
  38. @Test
  39. public void updateDoc() throws JsonProcessingException {
  40. Student student = new Student();
  41. student.setId(1000);
  42. student.setAge(30);
  43. student.setText("lisi");
  44. UpdateResponse.Result result = myEsService.updateDoc(student);
  45. System.out.println("update result:" + JSONObject.toJSONString(result));
  46. }
  47. //删除一个学生数据
  48. @Test
  49. public void delIndexDoc() {
  50. String result = myEsService.delIndexDoc("3007", Student.class);
  51. System.out.println("delIndexDoc:" + Student.class.getName());
  52. }
  53. //根据学生ID查询
  54. @Test
  55. public void getByIdStudent() {
  56. Student student = myEsService.findById("1000", Student.class);
  57. System.out.println(JSONObject.toJSONString(student));
  58. }
  59. }

  以上展示的一是一些基本用法,在源码中还有更多的用法,比如批量保存、更新、删除、查询等操作。整体使用起来非常简单,和使用Mybatis是不是感觉很像。

整个Starter具体实现原理大家可以看看代码,还算是比较简单,部分API主要用到了一些反射机制,浪费一点性能带来高效的开发体验还是很值得的,有兴趣的可以留言交流。

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

闽ICP备14008679号