当前位置:   article > 正文

SpringBoot中整合ElasticSearch实现增删改查等操作_使用springboot操作elasticsearch进行增删改查

使用springboot操作elasticsearch进行增删改查

场景

SpringBoot中整合ElasticSearch快速入门以及踩坑记录:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/135599698

在上面进行集成的基础上,实现对ES数据的增删改查等操作。

注:

博客:
霸道流氓气质-CSDN博客

实现

1、ElastciSearch的对象映射

Spring Data Elasticsearch - Reference Documentation

Spring Data Elasticsearch 对象映射是将 Java 对象(域实体)映射到存储在 Elasticsearch 中的 JSON 表示并返回的过程。

可用注解参考官网明细:

@Document:在类级别应用,以指示此类是映射到数据库的候选项。 最重要的属性是:

indexName:要存储此实体的索引的名称。 这可以包含一个 SpEL 模板表达式,例如"log-#{T(java.time.LocalDate).now().toString()}"

type:映射类型。 如果未设置,则使用类的小写简单名称。(自 4.0 版起已弃用)

shards:索引的分片数。

replicas:索引的副本数。

refreshIntervall:索引的刷新间隔。 用于创建索引。 默认值为“1s”。

indexStoreType:索引的索引存储类型。 用于创建索引。 默认值为“fs”。

createIndex:标记是否在存储库引导时创建索引。 默认值为 true。 请参阅使用相应映射自动创建索引

versionType:版本管理的配置。 默认值为 EXTERNAL。

@Id:在字段级别应用以标记用于标识目的的字段。

@Transient:默认情况下,所有字段在存储或检索文档时都映射到文档,此注释不包括该字段。

@PersistenceConstructor:标记给定的构造函数(甚至是受包保护的构造函数)以在从数据库实例化对象时使用。 构造函数参数按名称映射到检索到的 Document 中的键值。

@Field:应用于字段级别并定义字段的属性,大部分属性映射到相应的 Elasticsearch Mapping 定义(以下列表不完整,请查看注解 Javadoc 以获取完整参考):

name:将在 Elasticsearch 文档中表示的字段名称,如果未设置,则使用 Java 字段名称。

type:字段类型,可以是 Text、Keyword、Long、Integer、Short、Byte、Double、Float、Half_Float、Scaled_Float、Date、Date_Nanos、Boolean、Binary、Integer_Range、Float_Range、Long_Range、Double_Range、Date_Range、Ip_Range、Object、Nested、Ip、TokenCount、Percolator、Flattened、Search_As_You_Type之一。 请参阅 Elasticsearch 映射类型

format以及 Date 类型的定义。pattern

store:标记是否应将原始字段值存储在 Elasticsearch 中,默认值为 false。

analyzer、 ,用于指定自定义分析器和规范化程序。searchAnalyzernormalizer

@GeoPoint:将字段标记为geo_point数据类型。 如果字段是类的实例,则可以省略。GeoPoint

当然也可以自定义转换规则:

按照以上注解说明,新建实体类

  1. import lombok.AllArgsConstructor;
  2. import lombok.Builder;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import org.springframework.data.annotation.Id;
  6. import org.springframework.data.elasticsearch.annotations.Document;
  7. import org.springframework.data.elasticsearch.annotations.Field;
  8. import org.springframework.data.elasticsearch.annotations.FieldType;
  9. @Document(indexName="books",createIndex = true)
  10. @Data
  11. @Builder
  12. @NoArgsConstructor
  13. @AllArgsConstructor
  14. public class ElasticBook {
  15.     @Id
  16.     private Integer id;
  17.     @Field(type = FieldType.Text)
  18.     private String name;
  19.     @Field(type = FieldType.Text)
  20.     private String summary;
  21.     @Field(type = FieldType.Integer)
  22.     private Integer price;
  23. }

这里createIndex 默认就是true,可以不写,代表如果索引不存在则创建。

2、增删改查实现

新建接口Repository,使其继承ElasticsearchRepository

  1. import com.ruoyi.system.domain.study.ElasticBook;
  2. import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
  3. import org.springframework.stereotype.Repository;
  4. import java.util.List;
  5. @Repository
  6. public interface ElasticSearchRepository extends ElasticsearchRepository<ElasticBook,Integer> {
  7.     List<ElasticBook> findByName(String name);
  8. }

则可以直接使用其自带的各种方法

也可以自定义方法,比如findByName就是根据书名模糊搜索

自定义派生的方法不用实现,只要符合其关键字和规则可自动实现。

这块可参考官网从方法名称创建查询说明:

Spring Data Elasticsearch - Reference Documentation

3、新建Service接口

  1. import java.util.List;
  2. public interface IElasticSearchService {
  3.     void save(ElasticBook book);
  4.     ElasticBook findById(Integer id);
  5.     void update(ElasticBook book);
  6.     void deleteById(Integer id);
  7.     List<ElasticBook> findByName(String name);
  8. }

4、新建service实现

  1. import com.ruoyi.system.repository.ElasticSearchRepository;
  2. import com.ruoyi.system.service.IElasticSearchService;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Service;
  5. import java.util.List;
  6. @Service
  7. public class ElasticSearchServiceImpl implements IElasticSearchService {
  8.     @Autowired
  9.     private ElasticSearchRepository repository;
  10.     @Override
  11.     public void save(ElasticBook book) {
  12.         repository.save(book);
  13.     }
  14.     @Override
  15.     public ElasticBook findById(Integer id) {
  16.         return repository.findById(id).get();
  17.     }
  18.     @Override
  19.     public void update(ElasticBook book) {
  20.         repository.save(book);
  21.     }
  22.     @Override
  23.     public void deleteById(Integer id) {
  24.         repository.deleteById(id);
  25.     }
  26.     @Override
  27.     public List<ElasticBook> findByName(String name) {
  28.         return repository.findByName(name);
  29.     }
  30. }

5、编写单元测试

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest(classes = RuoYiApplication.class,webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
  3. public class ElasticSearchTest {
  4.     @Autowired
  5.     @Qualifier("elasticsearchClient")
  6.     public RestHighLevelClient highLevelClient;
  7.     @Autowired
  8.     private IElasticSearchService iElasticSearchService;
  9.     @Test
  10.     public void connecTest() throws IOException {
  11.         CreateIndexRequest request = new CreateIndexRequest("test");
  12.         CreateIndexResponse response = highLevelClient.indices().create(request, RequestOptions.DEFAULT);
  13.         // 查看是否创建成功
  14.         System.out.println(response.isAcknowledged());
  15.         highLevelClient.close();
  16.     }
  17.     //保存
  18.     @Test
  19.     public void saveTest() throws IOException {
  20.         ElasticBook book = ElasticBook.builder().id(1).name("书名1").summary("霸道的程序猿").price(100).build();
  21.         iElasticSearchService.save(book);
  22.         highLevelClient.close();
  23.         System.out.println("保存成功");
  24.     }
  25.     //根据主键查询
  26.     @Test
  27.     public void findTest() throws IOException {
  28.         ElasticBook book = ElasticBook.builder().id(2).name("书名2").summary("霸道的程序猿").price(80).build();
  29.         iElasticSearchService.save(book);
  30.         ElasticBook book1 = iElasticSearchService.findById(2);
  31.         highLevelClient.close();
  32.         System.out.println("查询成功");
  33.         System.out.println(book1);
  34.     }
  35.     //根据主键更新
  36.     @Test
  37.     public void updateTest() throws IOException {
  38.         ElasticBook book = ElasticBook.builder().id(2).name("书名2更新").summary("霸道的程序猿").price(80).build();
  39.         iElasticSearchService.update(book);
  40.         ElasticBook book1 = iElasticSearchService.findById(2);
  41.         highLevelClient.close();
  42.         System.out.println("更新成功");
  43.         System.out.println(book1);
  44.     }
  45.     //根据主键删除
  46.     @Test
  47.     public void deleteTest() throws IOException {
  48.         iElasticSearchService.deleteById(1);
  49.         highLevelClient.close();
  50.         System.out.println("删除成功");
  51.     }
  52.     //派生查询
  53.     @Test
  54.     public void findByNameTest() throws IOException {
  55.         List<ElasticBook> bookList = iElasticSearchService.findByName("书名");
  56.         highLevelClient.close();
  57.         System.out.println("查询成功");
  58.         System.out.println(bookList);
  59.     }
  60. }

6、单元测试运行结果

保存结果

根据主键查询结果

更新结果

模糊搜索

7、关于查询与扩展

通过上面简单入门后,关于查询还有计数、排序、分页、条件等高级用法,这里可以在需要用到时再查询官方文档查看

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号