Spring Data ElasticSearch

第一章 Spring Data ElasticSearch 使用

Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API 进行封装 。Spring Data为Elasticsearch项目提供集成搜索引擎。Spring Data Elasticsearch POJO的关键功能区域为中心的模型与Elastichsearch交互文档和轻松地编写一个存储库数据访问层。

4.1环境搭建

实现步骤:

  1. 创建SpringBoot的项目

  2. 勾选starter依赖坐标

  3. 编写持久层接口GoodDao,编写pojo实体类

    public interface GoodDao {
    }
    public class Good {
        private Long id;//商品的唯一标识
        private String title;//标题
        private String category;//分类
        private String brand;//品牌
        private Double price;//价格
        private String images;//图片地址
    	//getter,setter,toString
    }

     

  4. 配置文件,集群配置,ElasticSearch服务地址http://127.0.0.1:9300

    # 配置集群名称
    spring.data.elasticsearch.cluster-name=elasticsearch
    # 配置es的服务地址
    spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300

     

 

1、创建索引库操作

几个用到的注解:

  • @Document:声明索引库配置

    • indexName:索引库名称

    • type:类型名称,默认是“docs”

    • shards:分片数量,默认5

    • replicas:副本数量,默认1

  • @Id:声明实体类的id

  • @Field:声明字段属性

    • type:字段的数据类型

    • analyzer:指定分词器类型

    • index:是否创建索引 默认为true

    • store:是否存储 默认为false

       实体类的配置:

      /**
       * 商品实体类
       * @Document() 注解作用:定义一个索引库,一个类型
       * indexName属性:指定索引库的名称
       * type属性:指定类型名称
       * shards属性:指定分片数
       * replicas属性:指定复制副本数
       */
      @Document(indexName = "heima4",type = "goods",shards = 5,replicas = 1)
      public class Good {
          //必须有id,这里的id是全局唯一的标识,等同于es中的“_id”
          @Id
          private Long id;
          /**
           * type: 字段数据类型
           * analyzer: 分词器类型
           * index: 是否索引(默认值:true)
           * store: 是否存储(默认值:false)
           */
          @Field(type = FieldType.Text,analyzer = "ik_max_word")
          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(type = FieldType.Keyword,index = false)
          private String images;//图片地址
      	//getter ,setter ,toString
      }

      测试类:

      /**
       * 目标:完成创建索引,配置映射
       * 1.注入ElasticSearchTemplate对象
       * 2.配置Good实体类
       * 3.调用创建索引的方法createIndex()
       *   调用配置映射的方法PutMapping()
       *   测试删除索引方法deleteIndex()
       */
      @RunWith(SpringRunner.class)
      @SpringBootTest
      public class SpringdataEsIndex {
      
          //注入ElasticSearchTemplate模板对象
          @Autowired
          private ElasticsearchTemplate elasticsearchTemplate;
          //创建索引,配置映射
          @Test
          public void createIndexAndPutMapping() {
              //创建索引
              boolean indexResult = elasticsearchTemplate.createIndex(Good.class);
              System.out.println("创建索引结果:"+indexResult);
              //创建配置映射
              elasticsearchTemplate.putMapping(Good.class);
              System.out.println("配置映射结果:"+indexResult);
          }
          //删除索引
          @Test
          public void deleteIndex(){
              elasticsearchTemplate.deleteIndex(Good.class);
          }
      }

      2、文档的常见增删改查

      继承ElasticsearchRespository模板接口

/**
 *  继承持久层接口的ElasticSearch的模板接口
 */
public interface GoodDao extends ElasticsearchRepository<Good,Long> {
    
}

 测试类:

/**
 * 目标:完成基本的增删改查操作
 * 新增、修改、删除、根据id查询、查询所有、分页查询
 * 步骤:
 * 1.dao层接口继承ElasticSearchRepository的模板接口
 * 2.编写业务层的所有方法
 * 3.测试所有方法
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringdataEsGoodCRUD {

    //注入Good业务层实现类
    @Autowired
    private GoodDao goodDao;
    /**
     * 新增
     */
    @Test
    public void save(){
        Good good = new Good();
        good.setId(1l);
        good.setTitle("小米手机");
        good.setCategory("手机");
        good.setBrand("小米");
        good.setPrice(19999.0);
        good.setImages("http://image.leyou.com/12479122.jpg");
        goodDao.save(good);
    }
    //修改
    @Test
    public void update(){
        Good good = new Good();
        good.setId(1l);
        good.setTitle("小米手机");
        good.setCategory("手机");
        good.setBrand("小米");
        good.setPrice(9999.0);
        good.setImages("http://image.leyou.com/12479122.jpg");
        goodDao.save(good);
    }
    //删除
    @Test
    public void delete(){
        Good good = new Good();
        good.setId(1l);
        goodDao.delete(good);
    }
    //根据id查询
    @Test
    public void findById(){
        Good good = goodDao.findById(2l).get();
        System.out.println(good);
    }
    //查询所有
    @Test
    public void findAll(){
        Iterable<Good> goods = goodDao.findAll();
        for (Good good : goods) {
            System.out.println(good);
        }
    }
    //批量新增
    @Test
    public void saveAll(){
        List<Good> goodList = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            Good good = new Good();
            good.setId((long) i);
            good.setTitle("["+i+"]小米手机");
            good.setCategory("手机");
            good.setBrand("小米");
            good.setPrice(19999.0+i);
            good.setImages("http://image.leyou.com/12479122.jpg");
            goodList.add(good);
        }
        goodDao.saveAll(goodList);
    }
    //分页查询
    @Test
    public void findByPageable(){
        //设置排序(排序方式,正序还是倒序,排序的id)
        Sort sort = new Sort(Sort.Direction.DESC,"id");
        int currentPage=2;//当前页
        int pageSize = 100;//每页显示多少条
        //设置查询分页
        PageRequest pageRequest = PageRequest.of(currentPage, pageSize,sort);
        //分页查询
        Page<Good> goodPage = goodDao.findAll(pageRequest);
        for (Good good : goodPage.getContent()) {
            System.out.println(good);
        }
    }
}

3、Search查询

ElasticSearch的search方法中QueryBuilders,就是第一章中的查询对象构建对象QueryBuilders。QueryBuilders具备的能力,search方法都具备。所以,在这里重复内容不赘述,仅举例term查询。

/**
 * 目标:搜索
 * term查询、match查询,match_all查询...
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringdataEsSearch {

    //注入Good业务层实现类
    @Autowired
    private GoodDao goodDao;

    /**
     * term查询
     * search(termQueryBuilder) 调用搜索方法,参数查询构建器对象
     */
    @Test
    public void termQuery(){
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", "小米");
        Iterable<Good> goods = goodDao.search(termQueryBuilder);
        for (Good g : goods) {
            System.out.println(g);
        }
    }
    /**
     * term查询加分页
     */
    @Test
    public void termQueryByPage(){
        int currentPage= 0 ;
        int pageSize = 5;
        //设置查询分页
        PageRequest pageRequest = PageRequest.of(currentPage, pageSize);
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", "小米");
        Iterable<Good> goods = goodDao.search(termQueryBuilder,pageRequest);
        for (Good g : goods) {
            System.out.println(g);
        }
    }
}

4、自定义方法名称查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值