SpringBoot整合Spring Data Elasticsearch的过程详解

 更新时间:2019年09月20日 09:06:02   作者:steakliu  
这篇文章主要介绍了SpringBoot整合Spring Data Elasticsearch的过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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查询,然后自动帮你完成,无需写实现类。当然,方法名称要符合一定的约定:

上图是截取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上查看数据

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 抽象类使用Jackson序列化问题

    抽象类使用Jackson序列化问题

    这篇文章主要介绍了抽象类使用Jackson序列化问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 使用AOP的@Around后无返回值的解决

    使用AOP的@Around后无返回值的解决

    这篇文章主要介绍了使用AOP的@Around后无返回值的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Java中的static关键字深入理解

    Java中的static关键字深入理解

    这篇文章主要介绍了Java中的static关键字深入理解,文字和代码列举了实际例子,有感兴趣的同学可以研究下
    2021-03-03
  • Java数据结构与算法入门实例详解

    Java数据结构与算法入门实例详解

    这篇文章主要介绍了Java数据结构与算法入门实例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 深入dom4j使用selectSingleNode方法报错分析

    深入dom4j使用selectSingleNode方法报错分析

    本篇文章是对dom4j使用selectSingleNode方法报错进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Spring Boot集成Druid数据库连接池

    Spring Boot集成Druid数据库连接池

    这篇文章主要介绍了Spring Boot集成Druid数据库连接池,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • MyBatis查询数据库语句总结

    MyBatis查询数据库语句总结

    MyBatis是一种持久化框架,可以与许多不同类型的关系型数据库连接,下面这篇文章主要给大家介绍了关于MyBatis查询数据库语句的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • JavaEE简介_动力节点Java学院整理

    JavaEE简介_动力节点Java学院整理

    这篇文章主要介绍了JavaEE简介,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 使用Java将字节数组转成16进制形式的代码实现

    使用Java将字节数组转成16进制形式的代码实现

    在很多场景下,需要进行分析字节数据,但是我们存起来的字节数据一般都是二进制的,这时候就需要我们将其转成16进制的方式方便分析,本文主要介绍如何使用Java将字节数组格式化成16进制的格式并输出,需要的朋友可以参考下
    2024-05-05
  • 解决DataOutputStream乱码的问题

    解决DataOutputStream乱码的问题

    这篇文章主要介绍了DataOutputStream乱码问题的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09

最新评论