一:运行环境

JDK:1.8

ES:5.6.4

二:学习内容

如何构建spring-data-elasticsearch环境?

如何实现常用的增删改查?

如何实现对象嵌套也就是1对多这种关系?

三:JAVA依赖环境

根据spring-data-elasticsearch官网说明,我这采用的是3.0.6.RELEASE版本,spring boot采用的是2.0.1.RELEASE;

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <parent>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-starter-parent</artifactId>
  7. <version>2.0.1.RELEASE</version>
  8. <relativePath />
  9. </parent>
  10. <groupId>com.huize.pluto.els</groupId>
  11. <artifactId>demo</artifactId>
  12. <version>1.0.0-SNAPSHOT</version>
  13. <packaging>jar</packaging>
  14. <name>demo</name>
  15. <url>http://maven.apache.org</url>
  16. <properties>
  17. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  18. <elasticsearch.version>5.6.4</elasticsearch.version>
  19. <java.version>1.8</java.version>
  20. </properties>
  21. <repositories>
  22. <repository>
  23. <id>spring-libs-milestone</id>
  24. <url>https://repo.spring.io/libs-milestone</url>
  25. </repository>
  26. </repositories>
  27. <pluginRepositories>
  28. <pluginRepository>
  29. <id>spring-plugins-release</id>
  30. <url>https://repo.spring.io/plugins-release</url>
  31. </pluginRepository>
  32. </pluginRepositories>
  33. <dependencies>
  34. <dependency>
  35. <groupId>org.springframework.boot</groupId>
  36. <artifactId>spring-boot-starter-web</artifactId>
  37. </dependency>
  38. <dependency>
  39. <groupId>org.springframework.boot</groupId>
  40. <artifactId>spring-boot-starter-test</artifactId>
  41. <scope>test</scope>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework.data</groupId>
  45. <artifactId>spring-data-elasticsearch</artifactId>
  46. <version>3.0.6.RELEASE</version>
  47. </dependency>
  48. <!-- 强制声明ES版本 -->
  49. <dependency>
  50. <groupId>org.elasticsearch</groupId>
  51. <artifactId>elasticsearch</artifactId>
  52. <version>${elasticsearch.version}</version>
  53. </dependency>
  54. <!-- 因为要采用java编码直接操作ES所以需要引入 -->
  55. <dependency>
  56. <groupId>org.elasticsearch.client</groupId>
  57. <artifactId>transport</artifactId>
  58. <version>${elasticsearch.version}</version>
  59. <exclusions>
  60. <exclusion>
  61. <groupId>commons-logging</groupId>
  62. <artifactId>commons-logging</artifactId>
  63. </exclusion>
  64. </exclusions>
  65. </dependency>
  66. </dependencies>
  67. <build>
  68. <plugins>
  69. <plugin>
  70. <groupId>org.apache.maven.plugins</groupId>
  71. <artifactId>maven-compiler-plugin</artifactId>
  72. <version>3.5.1</version>
  73. <configuration>
  74. <source>1.8</source>
  75. <target>1.8</target>
  76. <compilerVersion>1.8</compilerVersion>
  77. <encoding>UTF-8</encoding>
  78. </configuration>
  79. </plugin>
  80. </plugins>
  81. </build>
  82. </project>

四、spring-data-elasticsearch详解

4.1:配置ES

声明 ElasticsearchTemplate  bean ;(当然也可以采用spring boot自动配置方法来实现,因为后面还得直接用JAVA API操作ES,所以这用代码配置了)


  1. /***
  2. ** 配置ES,支持集群
  3. */
  4. @Configuration
  5. public class ElasticConfigration {
  6. @Value("${elasticsearch.host}")
  7. private String esHost;
  8. @Value("${elasticsearch.port}")
  9. private int esPort;
  10. @Value("${elasticsearch.clusterName}")
  11. private String esClusterName;
  12. private TransportClient client;
  13. @PostConstruct
  14. public void initialize() throws Exception {
  15. Settings esSettings = Settings.builder()
  16. .put("cluster.name", esClusterName)
  17. .put("client.transport.sniff", true).build();
  18. client = new PreBuiltTransportClient(esSettings);
  19. String[] esHosts = esHost.trim().split(",");
  20. for (String host : esHosts) {
  21. client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host),
  22. esPort));
  23. }
  24. }
  25. @Bean
  26. public Client client() {
  27. return client;
  28. }
  29. @Bean
  30. public ElasticsearchTemplate elasticsearchTemplate() throws Exception {
  31. return new ElasticsearchTemplate(client);
  32. }
  33. @PreDestroy
  34. public void destroy() {
  35. if (client != null) {
  36. client.close();
  37. }
  38. }
  39. }

4.2:编写实体类

声明各个字段类型及相应属性:

  1. /**
  2. * 声明 USER实体,注意有一个1对多关系的roles
  3. **/
  4. @Document(indexName = "test-user", type = "user",replicas=0,shards=3)
  5. public class User {
  6. @Id
  7. private String id;
  8. @Field(type=FieldType.keyword)
  9. private String userName;
  10. @Field(type=FieldType.Integer)
  11. private Integer age;
  12. @Field(type=FieldType.Date)
  13. private Date birthday;
  14. /**
  15. * 声明分词器为ik_smart (注意 es要安装ik分词器插件)
  16. */
  17. @Field(searchAnalyzer="ik_smart",analyzer="ik_smart",type=FieldType.text)
  18. private String description;
  19. /**
  20. * 1对多在spring-data-elasticsearch 统一为nested类型
  21. **/
  22. @Field(type=FieldType.Nested,includeInParent=true)
  23. private List<Role> roles;
  24. public User() {}
  25. public User(String userName,Integer age,Date birthday,String description) {
  26. this.userName = userName;
  27. this.age = age;
  28. this.birthday = birthday;
  29. this.description = description;
  30. }
  31. public String getId() {
  32. return id;
  33. }
  34. public void setId(String id) {
  35. this.id = id;
  36. }
  37. public String getUserName() {
  38. return userName;
  39. }
  40. public void setUserName(String userName) {
  41. this.userName = userName;
  42. }
  43. public Date getBirthday() {
  44. return birthday;
  45. }
  46. public void setBirthday(Date birthday) {
  47. this.birthday = birthday;
  48. }
  49. public Integer getAge() {
  50. return age;
  51. }
  52. public void setAge(Integer age) {
  53. this.age = age;
  54. }
  55. public String getDescription() {
  56. return description;
  57. }
  58. public void setDescription(String description) {
  59. this.description = description;
  60. }
  61. public List<Role> getRoles() {
  62. return roles;
  63. }
  64. public void setRoles(List<Role> roles) {
  65. this.roles = roles;
  66. }
  67. }
  68. @Document(indexName = "test-role", type = "role",replicas=0,shards=3)
  69. public class Role {
  70. @Id
  71. private String id;
  72. @Field(type=FieldType.keyword)
  73. private String name;
  74. @Field(type=FieldType.Date)
  75. private Date createTime;
  76. @Field(searchAnalyzer="ik_smart",analyzer="ik_smart",type=FieldType.text)
  77. private String description;
  78. public Role() {}
  79. public Role(String name,String description,Date createTime) {
  80. this.name = name;
  81. this.description = description;
  82. this.createTime = createTime;
  83. }
  84. public String getId() {
  85. return id;
  86. }
  87. public void setId(String id) {
  88. this.id = id;
  89. }
  90. public String getName() {
  91. return name;
  92. }
  93. public void setName(String name) {
  94. this.name = name;
  95. }
  96. public Date getCreateTime() {
  97. return createTime;
  98. }
  99. public void setCreateTime(Date createTime) {
  100. this.createTime = createTime;
  101. }
  102. public String getDescription() {
  103. return description;
  104. }
  105. public void setDescription(String description) {
  106. this.description = description;
  107. }
  108. }

4.3:编写dao

只要继承ElasticsearchRepository就具有常用的增删减查功能了,可以新增一些其他需要用到的查询

  1. public interface UserRepository extends ElasticsearchRepository<User,String>{
  2. //按userName like查询
  3. List<User> findByUserNameLike(String userName);
  4. //按role的name属性查询
  5. List<User> findByRolesName(String name);
  6. //按role的name属性查询 两种方式都可以
  7. List<User> findByRoles_Name(String name);
  8. }

4.4:编写service

  1. @Service
  2. public class UserStandardService implements StandardService{
  3. @Autowired
  4. private UserRepository userRepository;
  5. @Autowired
  6. private ElasticsearchTemplate elasticsearchTemplate;
  7. /**
  8. * 批量新增
  9. **/
  10. @Override
  11. public void batchAddUser(List<User> users) {
  12. if(CollectionUtils.isEmpty(users)) {
  13. return ;
  14. }
  15. List<IndexQuery> queries = Lists.newArrayListWithExpectedSize(users.size());
  16. IndexQuery indexItem = null;
  17. for(User user :users) {
  18. indexItem = new IndexQuery();
  19. indexItem.setObject(user);
  20. queries.add(indexItem);
  21. }
  22. elasticsearchTemplate.bulkIndex(queries);
  23. }
  24. @Override
  25. public void addUser(User user) {
  26. userRepository.save(user);
  27. }
  28. @Override
  29. public void deletedUserById(String id) {
  30. userRepository.deleteById(id);
  31. }
  32. /**
  33. * 根据userId更新信息
  34. */
  35. @Override
  36. public void updateUser(User user) {
  37. UpdateQuery updateQuery = new UpdateQuery();
  38. updateQuery.setId(user.getId());
  39. updateQuery.setClazz(User.class);
  40. user.setId(null);
  41. UpdateRequest request = new UpdateRequest();
  42. request.doc(JsonUtils.beanToJson(user));
  43. updateQuery.setUpdateRequest(request);
  44. elasticsearchTemplate.update(updateQuery);
  45. }
  46. @Override
  47. public List<User> queryByUserName(String userName) {
  48. return userRepository.findByUserNameLike(userName);
  49. }
  50. @Override
  51. public List<User> queryByRoleName(Role role) {
  52. return userRepository.findByRoles_Name(role.getName());
  53. }
  54. }

4.5:启动

主要要加上 @EnableElasticsearchRepositories 注解;

  1. @EnableElasticsearchRepositories(basePackages = "com.test.els.demo.core.user.repository")
  2. @SpringBootApplication
  3. public class DemoApplication {
  4. private static final Logger logger = LoggerFactory.getLogger(DemoApplication.class);
  5. public static void main(String[] args) {
  6. SpringApplication.run(DemoApplication.class, args);
  7. logger.info("start completed !");
  8. }
  9. }

OK,到这spring-data-elasticsearch 实践完了。

spring boot2集成ES详解的更多相关文章

  1. Spring Boot 集成 FreeMarker 详解案例(十五)

    一.Springboot 那些事 SpringBoot 很方便的集成 FreeMarker ,DAO 数据库操作层依旧用的是 Mybatis,本文将会一步一步到来如何集成 FreeMarker 以及配 ...

  2. Spring各个jar包详解

    Spring各jar包详解 spring.jar 是包含有完整发布模块的单个jar 包.但是不包括mock.jar,aspects.jar, spring-portlet.jar, and sprin ...

  3. Spring Batch(4): Job详解

    Spring Batch(4): Job详解 2016-03-26 18:46 870人阅读 评论(1) 收藏 举报  分类: Spring(6)  版权声明:本文为博主原创文章,未经博主允许不得转载 ...

  4. SpringBoot系列(六)集成thymeleaf详解版

    SpringBoot系列(六)集成thymeleaf详解版 1. thymeleaf简介  1. Thymeleaf是适用于Web和独立环境的现代服务器端Java模板引擎.  2. Thymeleaf ...

  5. 安卓集成发布详解(二)gradle

    转自:http://frank-zhu.github.io/android/2015/06/15/android-release_app_build_gradle/ 安卓集成发布详解(二) 15 Ju ...

  6. Spring Data操作Redis详解

    Spring Data操作Redis详解 Redis是一种NOSQL数据库,Key-Value形式对数据进行存储,其中数据可以以内存形式存在,也可以持久化到文件系统.Spring data对Redis ...

  7. elasticSearch+spring 整合 maven依赖详解

    摘自:http://www.mayou18.com/detail/nTxPQSyu.html [Elasticsearch基础]elasticSearch+spring 整合 maven依赖详解 Ma ...

  8. Spring Aop底层原理详解

    Spring Aop底层原理详解(来源于csdn:https://blog.csdn.net/baomw)

  9. Spring Boot 自定义日志详解

    本节内容基于 Spring Boot 2.0. 你所需具备的基础 什么是 Spring Boot? Spring Boot 核心配置文件详解 Spring Boot 开启的 2 种方式 Spring ...

随机推荐

  1. 编写pl/sql时,报错

    /* 写一个简单的PL/SQL */ declare a ; b ; c number; begin c:=(a+b)/(a-b); dbms_output.put_line(c); exceptio ...

  2. python实现单单链表

    # -*- coding: utf-8 -*- # @Time : 2018/9/28 22:09 # @Author : cxa # @File : node.py # @Software: PyC ...

  3. 按需引入antd报错问题

    1.使用create-react-app工具创建了一个项目 create-react-app antd-demo 2.安装babel-plugin-import npm install babel-p ...

  4. 最后一面《HR面》------十大经典提问

    1.HR:你希望通过这份工作获得什么? 1).自杀式回答:我希望自己为之工作的企业能够重视质量,而且会给做得好的员工予以奖励.我希望通过这份工作锻炼自己,提升自己的能力,能让公司更加重视我. a.“我 ...

  5. SSIS 学习之旅 FTP文件传输-脚本任务

    这一章主要讲解一下用脚本怎么把CSV文件抛送到FTP服务器上 设计:   通过Demon库的Users表数据生成CSV文件.   生成后的CSV文件抛送到FTP指定目录下. 控件的使用这里就不做详细讲 ...

  6. 一步一步学习IdentityServer4 (1) 概要配置说明

    //结合EFCore生成IdentityServer4数据库 // 项目工程文件最后添加 <ItemGroup><DotNetCliToolReference Include=&qu ...

  7. GridView监听器

    package com.example.wang.testapp2; import android.os.Bundle; import android.support.v7.app.AppCompat ...

  8. 【LOJ】#2722. 「NOI2018」情报中心

    https://loj.ac/problem/2722 题解 考场上想了60分,但是由于自己不知道在怎么zz,我连那个ai<bi都没看到,误以为出题人没给lca不相同的部分分,然后觉得lca不同 ...

  9. 【51nod】1531 树上的博弈

    题解 我们发现每次决策的时候,我们可以判断某个点的决策,至少小于等于几个点或者至少大于等于几个点 我们求最大值 dp[u][1 / 0] dp[u][1]表示u这个点先手,至少大于等于几个点 dp[u ...

  10. Linux下的文件与目录权限

    一.用户(User).群组(Group)和其他人(Others) linux是多用户多任务的操作系统,同一时刻可能会有多个用户登录系统,考虑到文件的安全性等问题,所以Linux下的文件都属于一个特定的 ...