SpringBoot整合Spring Data Elasticsearch的过程详解

作者:steakliu 时间:2023-01-25 22:39:41 

Spring Data Elasticsearch提供了ElasticsearchTemplate工具类,实现了POJO与elasticsearch文档之间的映射

elasticsearch本质也是存储数据,它不支持事物,但是它的速度远比数据库快得多,

可以这样来对比elasticsearch和数据库

  • 索引(indices)--------数据库(databases)

  • 类型(type)------------数据表(table)

  • 文档(Document)---------------- 行(row)

  • 字段(Field)-------------------列(Columns )

整合:

1,在SprinBoot工程中引入jar包


<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

2,配置文件


spring.data.elasticsearch.cluster-name=elasticsearch //名字必须和elasticsearch.yml里面的cluster.name相同
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
spring.data.elasticsearch.repositories.enabled=true

3,创建实体,并对类和属性进行标注


@Document(indexName = "item",type = "docs", shards = 1, replicas = 0)//标记为文档类型,ndexName:对应索引库名称type:对应在索引库中的类型,shards:分片数量,默认5,replicas:副本数量,默认1
public class Item {
 @Id //主键
 private Long id;
 @Field(type = FieldType.Text, analyzer = "ik_max_word") //标记为成员变量FieldType,可以是text、long、short、date、integer等text:存储数据时候,会自动分词,并生成索引keyword:存储数据时候,不会分词建立索引analyzer:分词器名称
 private String title; //标题
 @Field(type = FieldType.Keyword)
 private String category;// 分类
 @Field(type = FieldType.Keyword)
 private String brand; // 品牌
 @Field(type = FieldType.Double)
 private Double price; // 价格
 @Field(index = false, type = FieldType.Keyword)//index:是否索引
 private String images; // 图片地址

4.引入模板ElasticsearchTemplate


 @Autowired
 private ElasticsearchTemplate elasticsearchTemplate;

5.创建一个索引


  //添加索引
 @Test
 public void addIndex() {
   elasticsearchTemplate.createIndex(Item.class);
 }

6.删除索引


 //删除索引
 @Test
 public void delete(){
   elasticsearchTemplate.deleteIndex("item");
 }

7.新增对象

继承Repository提供的一些子接口,就能具备各种基本的CRUD功能,这里继承ElasticsearchCrudRepository

首先定义一个对象的接口


public interface ItemRepository extends ElasticsearchCrudRepository<Item,Long> {
}

然后注入ItemRepository


 @Autowired
 private ItemRepository itemRepository;

新增对象


//新增一个对象
 @Test
 public void insert(){
   Item item = new Item(2L,"坚果R1","手机","锤子",2500.00,"http://image.baidu.com/13123.jpg");
   //Order order = new Order(20180020,"菜单");
   itemRepository.save(item);
 }

批量新增


//批量新增
 @Test
 public void insertList(){
   List<Item> list = new LinkedList<>();
   list.add(new Item(9L,"华为p20","手机","华为",3500.00,"http://image.baidu.com/13123.jpg"));
   list.add(new Item(10L,"华为p30","手机","华为",5450.00,"http://image.baidu.com/13123.jpg"));
   list.add(new Item(11L,"华为p30 pro","手机","华为",6980.00,"http://image.baidu.com/13123.jpg"));
   itemRepository.saveAll(list);
 }

8.查询


//根据字段查询所有
 @Test
 public void queryAll(){
   //升序,相应降序为dscending
   Iterable<Item> items = this.itemRepository.findAll(Sort.by("price").ascending());
   for (Item item : items){
     System.out.println(item);
   }
 }

9.自定义查询方法

Spring Data 的另一个强大功能,是根据方法名称自动实现功能,你的方法名叫做:findByTitle,那么它就知道你是根据title查询,然后自动帮你完成,无需写实现类。当然,方法名称要符合一定的约定:

SpringBoot整合Spring Data Elasticsearch的过程详解

上图是截取csdn上博主我要取一个响亮的昵称的图

根据手机名查找手机


//自定义方法,根据Title查询
 @Test
 public void findByTitle(){
   Item item = this.itemRepository.findByTitle("坚果pro");
   System.out.println(item);
 }

区间查询


//根据区间查询
 @Test
 public void queryByPriceBetween(){
   List<Item> list = this.itemRepository.findByPriceBetween(2000.00, 3500.00);
   for (Item item : list) {
     System.out.println("item = " + item);
   }
 }

模糊查询


//模糊查询
 @Test
 public void queryLikeTitle(){
   List<Item> list = this.itemRepository.findByTitleLike("R2");
   for (Item item : list){
     System.out.println(item);
   }
 }

使用自定义方法需要在接口里面申明方法


public interface ItemRepository extends ElasticsearchCrudRepository<Item,Long> {
 Item findByTitle(String title);
 List<Item> findByPriceBetween(double price1, double price2);
 List<Item> findByTitleLike(String title);
}

10.自定义查询


//自定义查询,查询数目等
 @Test
 public void matchQuery(){
   // 构建查询条件
   NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
   // 添加基本分词查询
   queryBuilder.withQuery(QueryBuilders.matchQuery("title","坚果"));
   //获取结果
   Page<Item> items = (Page<Item>) this.itemRepository.findAll();
   //条数
   long total = items.getTotalElements();
   System.out.println("total = "+total);
   for (Item item : items){
     System.out.println(item);
   }
 }关键的是NativeSearchQueryBuilder这个类

分页查询


//分页查询
 @Test
 public void queryByPage(){
   NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
   nativeSearchQueryBuilder.withQuery(QueryBuilders.termQuery("category","手机"));
   int page = 0;
   int size = 2;
   nativeSearchQueryBuilder.withPageable(PageRequest.of(page,size));
   Page<Item> items = (Page<Item>) this.itemRepository.findAll();
   long total = items.getTotalElements();
   int totalPage = items.getTotalPages();
   int nowPage = items.getNumber();
   int pageSize = items.getSize();
   System.out.println("总条数 = "+total);
   System.out.println("总页数 = "+totalPage);
   System.out.println("当前页 = "+nowPage);
   System.out.println("每页大小 = "+pageSize);
   for (Item item : items){
     System.out.println(item);
   }
 }

还有很多,就不意义列举

在elasticsearch-head上查看数据

SpringBoot整合Spring Data Elasticsearch的过程详解

关于安装elasticsearch-head,参考地址

Spring Data Elasticsearch文档:https://docs.spring.io/spring-data/elasticsearch/docs/3.1.10.RELEASE/reference/html/

来源:https://www.cnblogs.com/steakliu/p/11553199.html

标签:springboot,整合,spring,data,elasticsearch
0
投稿

猜你喜欢

  • 详解java WebSocket的实现以及Spring WebSocket

    2023-11-24 13:16:25
  • 浅谈c++11线程的互斥量

    2023-02-14 18:00:44
  • Java中的this、package、import示例详解

    2021-06-10 10:37:50
  • Kotlin基础教程之Run,标签Label,函数Function-Type

    2022-08-28 14:11:01
  • java 线程创建多线程详解

    2021-08-06 22:02:22
  • 详解如何在Java中加密和解密zip文件

    2022-12-07 12:26:46
  • SpringCloud之@FeignClient()注解的使用方式

    2022-05-16 04:22:40
  • Java获取彩色图像中的主色彩的实例代码

    2021-10-16 01:09:39
  • SpringBoot资源文件的存放位置设置方式

    2023-02-26 10:37:00
  • Java C++实现相同MD5加密算法的方式

    2023-10-12 12:26:02
  • Java多线程死锁与资源限制操作

    2023-08-31 05:54:30
  • java方法重写实例分析

    2022-01-10 02:51:14
  • Java实现单向链表的基本功能详解

    2022-12-18 10:57:02
  • OpenHarmony实现屏幕亮度动态调节方法详解

    2022-01-13 18:24:08
  • Java同步函数代码详解

    2022-10-13 23:22:03
  • C#使用Socket实现本地多人聊天室

    2022-01-06 12:47:27
  • OpenCV实现平均背景法

    2023-06-28 18:25:41
  • ArrayList在for循环中使用remove方法移除元素方法介绍

    2022-11-20 03:50:18
  • Spring Boot中操作使用Redis实现详解

    2023-11-24 02:39:29
  • C#调用摄像头实现拍照功能的示例代码

    2023-02-14 16:21:41
  • asp之家 软件编程 m.aspxhome.com