【Java】SpringBoot快速整合ElasticSearch

种地  论坛元老 | 2024-6-14 22:04:48 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1048|帖子 1048|积分 3144

什么是ES?

        Elasticsearch(简称为ES)是一个开源的分布式搜刮引擎,用于全文搜刮、实时分析和可视化。它建立在Apache Lucene搜刮引擎库的根本上,提供了RESTful API,支持分布式架构和程度扩展,特别实用于处置惩罚大规模的非结构化或半结构化数据。
Elasticsearch与传统数据库查询的区别:



  • 搜刮引擎特性: Elasticsearch是一个搜刮引擎,其重要计划目标是支持高效的全文搜刮和实时分析。它专注于处置惩罚大量文本数据,支持复杂的全文搜刮查询,例如模糊搜刮、词组匹配、范围查询等。传统数据库重要面向结构化数据,更实用于关系型查询
  • 分布式和程度扩展: Elasticsearch是分布式的,它可以在多个节点上运行,并可以大概程度扩展以处置惩罚大规模数据。传统数据库通常在单个节点上运行,并且通常需要垂直扩展(增长服务器性能)来处置惩罚更大的负载。
  • Schema-less(无模式): Elasticsearch是无模式的,意味着你不需要在索引中预界说数据结构。你可以直接插入数据,Elasticsearch会根据数据主动推断其类型。传统数据库需要在创建表时界说模式。
  • 实时性: Elasticsearch提供实时索引和搜刮功能,数据险些立即可用于搜刮。传统数据库的实时性大概受到数据复制和索引的影响。
  • 多语言支持: Elasticsearch支持多种查询语言,例如查询字符串、DSL(Domain Specific Language)等,使其更易于使用和集成。传统数据库通常使用SQL。
        要在Spring Boot项目中集成Elasticsearch,首先需要添加相应的依靠,然后配置Elasticsearch的连接信息,末了通过Spring Data Elasticsearch或者Elasticsearch的Java REST客户端来与Elasticsearch举行交互。
SpringBoot整合ElasticSearch的步调:

0.代码层级结构


1. 添加依靠

在pom.xml中添加Spring Data Elasticsearch依靠:
  1. <dependency>
  2.       <groupId>org.springframework.boot</groupId>
  3.       <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  4. </dependency>
复制代码
2. 配置Elasticsearch连接信息

在application.properties或(application.yml)中配置Elasticsearch连接信息,如下:
  1. spring.elasticsearch.uris=http://localhost:9200
复制代码
  1. spring:
  2.   elasticsearch:
  3.     uris: http://localhost:9200
复制代码
如果Elasticsearch没有设置用户名和暗码,这大概就足够了。如果需要认证,可以使用以下配置:
  1. spring.elasticsearch.username=your_username
  2. spring.elasticsearch.password=your_password
复制代码
  1. spring:
  2.   elasticsearch:
  3.     uris: http://localhost:9200
  4.     username:your_username    password:your_password
复制代码
3. 创建实体类

创建一个简朴的实体类,使用@Document注解指定索引和类型:
  1. import lombok.Data;
  2. import org.springframework.data.annotation.Id;
  3. import org.springframework.data.elasticsearch.annotations.Document;
  4. /**
  5. * @Document(indexName = "user-demo") 索引名称为user-demo
  6. * */
  7. @Data
  8. @Document(indexName = "user-demo")
  9. public class User {
  10.     @Id
  11.     private String id;
  12.     private String username;
  13.     private String address;
  14.     private Integer age;
  15.     private String gender;
  16. }
复制代码
4. 使用Spring Data Elasticsearch举行操作

创建一个UserMapper接口,继承自ElasticsearchRepository:
  1. import com.example.demoes.entity.User;
  2. import org.springframework.data.domain.Page;
  3. import org.springframework.data.domain.Pageable;
  4. import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
  5. import org.springframework.stereotype.Repository;
  6. import java.util.List;
  7. /**
  8. * 这些方法的名称遵循一种命名约定,这种约定将方法名中的关键词(如 findBy、Like、IgnoreCase 等)与实体类(User)的属性名相关联。
  9. * 这样,Spring Data Elasticsearch 可以根据方法名自动生成相应的查询。
  10. *
  11. * 在Spring Data Elasticsearch中,查询方法的命名约定依赖于一些关键词和命名规范,这些关键词用于描述要执行的查询操作。以下是一些常见的关键词和它们的含义:
  12. *
  13. *     findBy:指定查询的条件的前缀,后面通常跟随实体类的属性名。例如,findByUsername 表示要根据用户名进行查询。
  14. *
  15. *     Like:用于模糊查询,通常与属性名一起使用。例如,findByUsernameLike 表示要进行用户名的模糊查询。
  16. *
  17. *     IgnoreCase:用于不区分大小写的查询,通常与属性名一起使用。例如,findByUsernameIgnoreCase 表示不区分大小写地查询用户名。
  18. *
  19. *     Containing:用于包含查询,通常与属性名一起使用。例如,findByUsernameContaining 表示包含指定内容的查询。
  20. *
  21. *     And 和 Or:用于构建复合查询条件。例如,findByUsernameAndAge 表示根据用户名和年龄进行查询。
  22. *
  23. *     OrderBy:用于指定结果的排序方式。例如,findByAgeOrderByUsernameDesc 表示根据年龄查询并按用户名降序排序。
  24. *
  25. *     Page 和 Iterable:用于指定查询结果的返回类型。例如,Page<User> 表示返回分页结果,Iterable<User> 表示返回一个列表。
  26. *
  27. *     其他属性名:您可以根据实体类的属性名来定义查询条件。例如,如果实体类有一个属性为 email,您可以编写 findByEmail 方法来根据邮箱进行查询。
  28. * */
  29. @Repository
  30. public interface UserMapper extends ElasticsearchRepository<User,String> {
  31.     /**
  32.      *自定义查询
  33.      * */
  34.     List<User> findByAddressLikeIgnoreCaseOrderByAgeDesc(String address);
  35.     Page<User> findByUsernameContaining(String username, Pageable page);
  36.     User findByAge(Integer age);
  37.     List<User> findByGender(String gender);
  38.     long count();
  39.     Boolean existsById();
  40. }
复制代码
5.测试

        在测试中使用Spring Boot的@SpringBootTest注解,来验证Elasticsearch是否正常工作。
  1. import com.example.demoes.entity.User;
  2. import com.example.demoes.mapper.UserMapper;
  3. import org.junit.jupiter.api.Test;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.test.context.SpringBootTest;
  6. import org.springframework.data.domain.Page;
  7. import org.springframework.data.domain.PageRequest;
  8. import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
  9. import java.util.*;
  10. @SpringBootTest
  11. class DemoEsApplicationTests {
  12.     //    @Resource
  13.     @Autowired
  14.     private UserMapper userMapper;
  15.     @Autowired
  16.     private ElasticsearchRestTemplate elasticsearchRestTemplate;
  17.     @Test
  18.     void add() {
  19.         for (int i = 2; i < 11; i++) {
  20.             User user = new User();
  21.             user.setId(i + "");
  22.             user.setUsername("zhangsan" + i);
  23.             user.setGender("男");
  24.             user.setAge(i + i);
  25.             user.setAddress("河北省" + i);
  26.             //直接将数据保存到es中,索引名称为user-demo,在user对象中设置的
  27.             //通过kibana进行查询GET /user-demo/_search
  28.             User save = userMapper.save(user);
  29.             System.out.println("save = " + save);
  30.         }
  31.     }
  32.     @Test
  33.     void delete() {
  34.         String id = "9";
  35.         userMapper.deleteById(id);
  36.     }
  37.     @Test
  38.     void update() {
  39.         User updateUser = new User();
  40.         updateUser.setId("9");
  41.         updateUser.setUsername("Lisi");
  42.         updateUser.setGender("女");
  43.         updateUser.setAddress("北京市");
  44.         updateUser.setAge(39);
  45.         User save = userMapper.save(updateUser);
  46.         System.out.println("save = " + save);
  47.     }
  48.     @Test
  49.     void find() {
  50.         //模糊查询。精确查询
  51.         Iterable<User> all = userMapper.findAll();
  52.         List<User> list = new ArrayList<>();
  53.         for (User user : all) {
  54.             list.add(user);
  55.         }
  56.         // 使用Collections.sort方法按照用户的ID进行排序
  57. //        Collections.sort(list, Comparator.comparing(User::getId));
  58.         // 使用自定义比较器按照用户的ID进行排序
  59.         Collections.sort(list, new Comparator<User>() {
  60.             @Override
  61.             public int compare(User user1, User user2) {
  62.                 // 假设ID是字符串类型
  63.                 return user1.getUsername().compareTo(user2.getUsername());
  64.             }
  65.         });
  66.         // 使用流(Stream)按照用户的ID进行排序
  67.         /*List<User> sortedList = list.stream()
  68.                 .sorted(Comparator.comparing(User::getId))
  69.                 .collect(Collectors.toList());*/
  70.         // 现在list中的用户已按照ID升序排列
  71.         for (User user : list) {
  72.             System.out.println("user = " + user);
  73.         }
  74.     }
  75.     @Test
  76.     void findById() {
  77.         //注意这里的id是字符串类型,然后userMapper中继承的id也必须是String类型
  78.         Optional<User> byId = userMapper.findById("4");
  79.         System.out.println("byId = " + byId);
  80.     }
  81.     @Test
  82.     void findCount() {
  83.         long count = userMapper.count();
  84.         System.out.println("count 数 " + count);
  85.     }
  86.     @Test
  87.     void existsById() {
  88.         System.out.println("id是否存在: " + userMapper.existsById("1"));
  89.     }
  90.     @Test
  91.     void findByIdAll() {
  92.         ArrayList<String> ids = new ArrayList<>();
  93.         ids.add("3");
  94.         ids.add("5");
  95.         ids.add("4");
  96.         ids.add("66");
  97.         //通过ids(集合)进行查询对应的user集合对象
  98.         Iterable<User> allById = userMapper.findAllById(ids);
  99.         for (User user : allById) {
  100.             System.out.println("user = " + user);
  101.         }
  102.     }
  103.     /**
  104.      * 自定义查询
  105.      */
  106.     @Test
  107.     void findByUsernameLike() {
  108.         //模糊查询,会通过命名规范进行一个查询
  109.         List<User> addr = userMapper.findByAddressLikeIgnoreCaseOrderByAgeDesc("河北");
  110.         System.out.println("addr = " + addr);
  111.         Page<User> page = userMapper.findByUsernameContaining("4", PageRequest.of(0, 100));
  112.         System.out.println("page = " + page.getContent());
  113.         User zhangList = userMapper.findByAge(16);
  114.         System.out.println("user = " + zhangList);
  115.         List<User> gender = userMapper.findByGender("女");
  116.         System.out.println("gender = " + gender);
  117.     }
复制代码
        以上步调是一个简朴的Spring Boot集成Elasticsearch的示例。你可以根据你的实际需求举行更复杂的配置和操作。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表