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

news/2024/12/2 16:52:17/

   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、应用添加依赖

<dependency><groupId>com.my.es</groupId><artifactId>elasticsearch-starter</artifactId><version>1.0.0-SNAPSHOT</version>     
</dependency>

2.1.2、应用添加ES链接配置

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

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

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

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

 3.1 定义索引对象

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

package com.my.es.test.model;import java.util.Date;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;/*** * 学生索引* @authro nantian* @date 2022-09-28 15:34*/
@Data
@AllArgsConstructor
@Document(indexName = "index_student")
//分片设置,一般不建议代码中创建索引,在Kibana中进行管理比较合适
//@Setting(shards = 5,replicas = 1)
@NoArgsConstructor
public class Student {//索引主键@Idprivate long id;@Field(type = FieldType.Keyword)private String name;@Field(type = FieldType.Keyword)private String text;//@Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_smart")@Field(type = FieldType.Keyword)private String desc;//@Field(type = FieldType.Text,analyzer = "ik_smart")@Field(type = FieldType.Keyword)private String title;@Field(type = FieldType.Integer)private Integer age;@Field(type = FieldType.Date)private Date date;//版本号,可以解决数据冲突问题@Versionprivate Long version;
}

    3.2 增删改查

@SpringBootTest
public class MyEsServiceTest {@Autowiredprivate MyEsService myEsService;//删除索引 @Testpublic void delIndex() {boolean result = myEsService.deleteIndexIfExist(Student.class);Assert.assertTrue(result);}//更新索引结构@Testpublic void updateMapping() {boolean result = myEsService.updateIndexMapping(Student.class);Assert.assertTrue(result);}//创建学生索引 @Testpublic void createIndex() {boolean exist = myEsService.existIndex(Student.class);boolean result = false;if (!exist) {result = myEsService.createIndexIfNotExist(Student.class);} else {System.out.println("index exist:" + Student.class.getName());}Assert.assertTrue(result);}//添加一个学生数据到索引中@Testpublic void addIndexDoc() {Student student = new Student(1000, "张三", "测试索引添加", "哈哈", "三年二班刘", 10, new Date(), null);String documentId = myEsService.addIndexDoc(student);System.out.println("addIndexDoc result:" + documentId);Assert.assertNotNull(documentId);}//更新一个学生数据@Testpublic void updateDoc() throws JsonProcessingException {Student student = new Student();student.setId(1000);student.setAge(30);student.setText("lisi");UpdateResponse.Result result = myEsService.updateDoc(student);System.out.println("update result:" + JSONObject.toJSONString(result));}//删除一个学生数据@Testpublic void delIndexDoc() {String result = myEsService.delIndexDoc("3007", Student.class);System.out.println("delIndexDoc:" + Student.class.getName());}//根据学生ID查询@Testpublic void getByIdStudent() {Student student = myEsService.findById("1000", Student.class);System.out.println(JSONObject.toJSONString(student));}
}

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

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


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

相关文章

配送平台从设计到实践的经验总结

配送平台在现代物流领域扮演着重要的角色&#xff0c;它通过协调货物的运输和交付&#xff0c;为商家和消费者提供了高效、可靠的配送服务。本篇博客文章将深入探讨配送平台从设计到实践的全过程&#xff0c;并分享关键的经验和最佳实践。 ### 1. 业务需求与目标 在设计配送平…

Linux异步通知实验:应用程序对异步通知的处理

一. 简介 前面文章学习了 应用程序对异步通知的处理方法&#xff0c;另一篇文章实现了Linux驱动对异步通知的处理&#xff1a; Linux应用程序对异步通知的处理-CSDN博客 Linux异步通知实验&#xff1a;驱动中异步通知的处理-CSDN博客 本文继续Linux异步通知实验&#xff0c…

Midjourney指控Stability AI夜袭数据,网络风波一触即发

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Linux的MySQL安装与卸载

安装与卸载 卸载安装配置yum源安装MySQL 声明一下本人用的Linux版本是CentOs7.9版本的。 卸载 如果我们用的云服务器&#xff0c;云服务器可能会自带MySQL或者mariadb&#xff08;其实就是MySQL的一个开源分支&#xff09;&#xff0c;如果我们不想用自带的&#xff0c;需要先…

nginx详解,配置http,https,负载均衡,反向代理,SMTP 代理步骤说明

Nginx 是一款高性能的开源 Web 服务器,同时也可以用作反向代理服务器、负载均衡器、HTTP 缓存、HTTPS 中继、以及作为邮件代理服务器等。以下是 Nginx 可以实现的一些常见用途: 静态内容服务: Nginx 可以用来提供静态内容,比如 HTML、CSS、JavaScript 文件等。 动态内容服务…

C++(3/12)

自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和 #include <iostream>using name…

C#+datax实现定时增量同步

要使用C#和DataX实现定时增量同步&#xff0c;你可以使用以下步骤&#xff1a; 1. 安装DataX&#xff1a;首先&#xff0c;确保你已经安装了DataX。你可以从DataX的官方仓库中获取最新版本。 2. 配置DataX 任务&#xff1a;创建一个DataX任务&#xff0c;定义源&#xff08;sou…

C++ 数据封装的方法,重点是其编程思想

数据封装 先说一下概念吧&#xff01; 在C中&#xff0c;数据封装一般指的是将数据和操作这些数据的函数绑定在一起的程序设计方式。通常使用C的类来实现。 作用 C中&#xff0c;数据封装是C面向对象编程的一种核心概念。 通过数据封装&#xff0c;即将数据和操作数据的函…