赞
踩
本文介绍 RestHighLevelClient原生客户端 和 傻瓜级ElasticSearch搜索引擎ORM框架Easy-Es 两种方式将es集成到Spring Boot。
Spring Boot版本:2.3.12.RELEASE
ElasticSearch版本:7.14.0
此处仅引入必要依赖,其余依赖按需引入。
<!--elasticsearch--> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.14.0</version> <exclusions> <exclusion> <artifactId>log4j-api</artifactId> <groupId>org.apache.logging.log4j</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client</artifactId> <version>7.14.0</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.14.0</version> <exclusions> <exclusion> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> </exclusion> <exclusion> <artifactId>elasticsearch-rest-client</artifactId> <groupId>org.elasticsearch.client</groupId> </exclusion> </exclusions> </dependency>
elasticsearch:
hosts: 127.0.0.1:9200
userName: elastic
password: elastic
clusterName: single-node-cluster
connectTimeOut: 1000
connectionRequestTimeOut: 500
maxConnectNum: 100
maxConnectNumPerRoute: 100
scheme: http
socketTimeOut: 30000
import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpHost; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.client.BasicCredentialsProvider; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.ArrayList; import java.util.List; /** * restHighLevelClient 客户端配置类 */ @Slf4j @Data @Configuration @ConfigurationProperties(prefix = "elasticsearch") public class ElasticsearchConfig { // es host ip 地址(集群) private String hosts; // es 用户名 private String userName; // es 密码 private String password; // es 请求方式 private String scheme; // es 集群名称 private String clusterName; // es 连接超时时间 private int connectTimeOut; // es socket 连接超时时间 private int socketTimeOut; // es 请求超时时间 private int connectionRequestTimeOut; // es 最大连接数 private int maxConnectNum; // es 每个路由的最大连接数 private int maxConnectNumPerRoute; /** * 如果@Bean没有指定bean的名称,那么这个bean的名称就是方法名 */ @Bean(name = "restHighLevelClient") public RestHighLevelClient restHighLevelClient() { RestHighLevelClient restHighLevelClient = null; try { // 集群,拆分地址 List<HttpHost> hostLists = new ArrayList<>(); String[] hostList = hosts.split(","); for (String addr : hostList) { String host = addr.split(":")[0]; String port = addr.split(":")[1]; hostLists.add(new HttpHost(host, Integer.parseInt(port), scheme)); } // 转换成 HttpHost 数组 HttpHost[] httpHost = hostLists.toArray(new HttpHost[]{}); // 构建连接对象 RestClientBuilder builder = RestClient.builder(httpHost); // 设置用户名、密码 CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password)); // 连接延时配置 builder.setRequestConfigCallback(requestConfigBuilder -> { requestConfigBuilder.setConnectTimeout(connectTimeOut); requestConfigBuilder.setSocketTimeout(socketTimeOut); requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut); return requestConfigBuilder; }); // 连接数配置 builder.setHttpClientConfigCallback(httpClientBuilder -> { httpClientBuilder.setMaxConnTotal(maxConnectNum); httpClientBuilder.setMaxConnPerRoute(maxConnectNumPerRoute); httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); return httpClientBuilder; }); restHighLevelClient = new RestHighLevelClient(builder); } catch (NumberFormatException e) { log.error("ES 连接池初始化异常"); } return restHighLevelClient; } }
Easy-ES官方地址 https://www.easy-es.cn/
此处仅引入必要依赖,其余依赖按需引入。
<!--spring-boot-starter-web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!--排除spring-boot自带的es依赖--> <exclusions> <exclusion> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> </exclusion> <exclusion> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> </exclusion> </exclusions> </dependency> <!--elasticsearch--> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.14.0</version> </dependency> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.14.0</version> </dependency> <dependency> <groupId>org.dromara.easy-es</groupId> <artifactId>easy-es-boot-starter</artifactId> <version>2.0.0-beta8</version> </dependency>
此处仅做基础配置,详细配置见官方文档。
easy-es:
banner: false
address: 127.0.0.1:9200
username: elastic
password: elastic
import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; import org.dromara.easyes.annotation.IndexName; import java.io.Serializable; @Getter @Setter @Accessors(chain = true) @IndexName public class Student implements Serializable { private static final long serialVersionUID = 1L; // @IndexId(type = IdType.CUSTOMIZE) private String id; private String studentName; private int age; }
注意:easy-es的操作与Mybatis-Plus十分类似,项目中若引用了Mybatis-Plus,不要引错包。
import org.dromara.easyes.core.kernel.BaseEsMapper;
public interface StudentMapper extends BaseEsMapper<Student> {
}
该测试只是简单的测试了部分方法,更多操作详见官方文档。
import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson2.JSONObject; import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.List; @SpringBootTest @RunWith(SpringRunner.class) public class EsTest { @Autowired private StudentMapper studentMapper; // 根据实体类创建索引 // 默认是1分片1备份,更加详细的索引创建可参考官方文档 目录:索引CRUD @Test public void createIndex() { studentMapper.createIndex(); } // 添加数据,数据id默认自动生成,若想自定义参考官方文档 目录:注解 @IndexId @Test public void addData() { Student student = new Student(); student.setId("2"); student.setStudentName("王五"); student.setAge(20); Integer insert = studentMapper.insert(student); System.err.println(insert); } // 查询数据 @Test public void getData() { LambdaEsQueryWrapper<Student> queryWrapper = new LambdaEsQueryWrapper<>(); queryWrapper.eq(Student::getStudentName, "张三"); Student student = studentMapper.selectOne(queryWrapper); System.err.println(JSONObject.toJSONString(student)); } // 更新数据 @Test public void updateData01() { int age = 20; Student student = new Student(); student.setId("1"); student.setAge(age); System.err.println(studentMapper.updateById(student)); } // 更新数据 @Test public void updateData02() { LambdaEsQueryWrapper<Student> queryWrapper = new LambdaEsQueryWrapper<>(); queryWrapper.eq(Student::getId, "1"); Student student = new Student(); student.setId("1"); student.setAge(18); System.err.println(studentMapper.update(student, queryWrapper)); } // 查询所有数据 @Test public void getAllData() { LambdaEsQueryWrapper<Student> queryWrapper = new LambdaEsQueryWrapper<>(); List<Student> list = studentMapper.selectList(queryWrapper); list.forEach(student -> System.out.println(student.getStudentName() + " == " + student.getAge() + " == " + student.getId())); } // 根据id批量删除数据 @Test public void deleteAllData() { Integer i = studentMapper.deleteBatchIds(CollUtil.newArrayList("1", "2")); System.err.println(i); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。