Java学习笔记____ElasticSearch进阶(三)

ElasticSearch进阶   ——与Spring Data基本整合

 

目录

## Spring Data简述

## Spring Data ElasticSearch概述

## 与Spring Data基本整合

|----基础CRUD

|----复杂查询


## Spring Data简述:    

      SpringData是一个用于简化数据库访问,并支持云服务的开源框架。主要目标是使得对数据的访问变得方便快捷,
  可以极大的简化JPA的写法几乎不用写实现的情况下,实现对数据的访问和操作

      官方网站:http://projects.spring.io/spring-data/

## Spring Data ElasticSearch概述:

      基于spring data API简化Elasticsearch操作,将原始操作API进行封装,同时还为Elasticsearch项目提供集成搜索
  引擎。
Spring Data Elasticsearch的关键功能区域为中心的模型POJO与Elastichsearch交互文档结合轻松地编写一个
  存储库数据访问层。
      官方网站:http://projects.spring.io/spring-data-elasticsearch/

## 与Spring Data基本整合:

      简化ES的原生操作,推荐与Spring Data JPA对照理解

      技术选型
          SpringBoot + SpringDataElasticSearch
      环境搭建:与SpringDataJPA类似
          1.导入依赖
              Spring-boot-starter-parent
                       -starter-web
                       -starter-data-elasticsearch
          2.准备核心配置文件application.properties

    # ES
    #开启 Elasticsearch 仓库(默认值:true)
    spring.data.elasticsearch.repositories.enabled=true
    #默认 9300 是 Java 客户端的端口。9200 是支持 Restful HTTP 的接口
    spring.data.elasticsearch.cluster‐nodes = 127.0.0.1:9300
    #集群名(默认值: elasticsearch)
    #spring.data.elasticsearch.cluster‐name Elasticsearch 
    #集群节点地址列表,用逗号分隔。如果没有指定,就启动一个客户端节点
    #spring.data.elasticsearch.cluster‐nodes 
    #客户端的额外属性
    #spring.data.elasticsearch.propertie
    #连接超时的时间
    spring.data.elasticsearch.properties.transport.tcp.connect_timeout=120s

          3.准备启动类
              @SpringBootApplication


    @SpringBootApplication
    public class SpringBootApplicationRunner {
        public static void main(String[] args) {
            SpringApplication.run(SpringBootApplicationRunner.class,args);
        }
    }

          4.准备实体类,添加注解映射索引库信息
               类上:   @Document(indexName = 索引名, type = 类型)       
               属性上:
                   @Id
                   @Field(index=是否分词,analyzer=存储分词器,searchAnalyze=搜索分词器,store=是否存储,type=数据类型)
              [注意]:
                   1.实体类层级应当与索引层级对应,即@Document注解中indexName项必填
                   2.属性注解@Id声明该文档唯一标识
                      @Field可省,即使用默认配置,但一旦添加该注解,所有的默认值将不再生效且type字段必填

    @Document(indexName = "blog1", type = "article")
    public class Article {

        @Id
        private Integer id;
        private String title;
        private String content;

        ...
        // 此处省略get/set方法
    }

          5.准备持久层dao接口
              extends ElasticsearchRepository<实体类, 唯一标识类型>         

    public interface ArticleDao extends ElasticsearchRepository<Article,Integer>{  

        // 复杂查询:命名规范条件查询
        Page<Article> findByTitle(String str, Pageable pageable);

    }

          6.准备业务层service接口及实现类
              业务层实现类:

    @Autowired
    private ArticleDao articleDao;
    //保存
    @Override
    public void save(Article article) {
        articleDao.save(article);
    }
    //更新
    @Override
    public void update(Article article) {
        articleDao.save(article);
    }
    //删除:对象方式
    @Override
    public void delete(Article article) {
        articleDao.delete(article);
    }
    //删除:Id方式
    @Override
    public void deleteById(int id) {
        articleDao.deleteById(id);
    }
    //查询:所有
    @Override
    public Iterable<Article> findAll() {
        return articleDao.findAll();
    }
    
    //复杂查询
    //查询:分页
    @Override
    public Page<Article> findAll(Pageable pageable) {
        return articleDao.findAll(pageable);
    }
    //查询:条件
    @Override
    public Page<Article> findAll(String str, Pageable pageable) {
        return articleDao.findByTitle(str,pageable);
    }

      基础CRUD:

         C
             1.创建实体类对象
             2.组装文档信息属性值
             3.调用service相应方法进行保存
         U:操作同保存
             本质上是对之前内容的覆盖
             [注意]:
                  由于是覆盖操作,故更新后的文档内容对应更新时操作的对象,也就是说若更新时操作的对象有空的属
                  性值,更新后索引中相应的文档信息将不会保留之前内容而是为空
         R:查询所有
              调用service相应方法进行分页查询
              [注意]:
                  框架封装的查询所有方法返回值为Iterable类型,可以通过迭代器遍历取其内容作进一步处理
         D:根据对象/直接通过Id进行删除
              对象方式:
                  1.创建实体类Article对象
                  2.组装所需删除文档Id
                  3.调用service相应方法进行删除
              Id方式:
                  调用service相应方法并携带文档Id进行删除      测试类:

    @Autowired
    private ArticleService articleService;

    //保存
    @Test
    public void saveTest(){
        // 创建实体类Article对象
        Article article = new Article();
        // 组装文档信息属性
        article.setId(1);
        article.setTitle("elasticSearch 3.0版本发布...保存");
        article.setContent("ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力" +
                "的全文搜索引擎,基于RESTful web接口");
        // 调用service相应方法进行保存
        articleService.save(article);
    }

    //修改
    @Test
    public void updateTest(){
        // 创建Article
        Article article = new Article();
        article.setId(1);
        article.setTitle("elasticSearch 3.0版本发布...更新");
        // 因为没有设置内容信息,故更新后的文档内容为空
        articleService.update(article);
    }

    //删除
    @Test
    public void deleteTest(){
        // 对象方式
        Article article = new Article();
        // 组装所需删除文档Id
        article.setId(1);
        // 调用service相应方法进行删除
        articleService.delete(article);

        // id方式
        //articleService.deleteById(1);
    }
    
    //查询
    @Test
    public void findTest(){
        Iterable<Article> list = articleService.findAll();
        for (Article article : list) {
            System.out.println(article);
        }
    }

        复杂查询:

              分页:分页 + 排序
                   1.准备Pageable对象,并组装分页参数及排序原则
                        PageReqeust.of(startIndex,  size, sort);
                   2.调用service相应方法进行分页查询,获取Page对象
                   3.获取分页结果内容
                        .getContent();
                   [注意]:
                        查询结果不同于原生ES,默认将显示全部命中结果
              条件:方法命名规范
                   1.需要事先在Dao层按照命名规则自定义所需的条件查询方法
                   2.调用service层自定义条件查询方法
                   [注意]:
                        由于是按照方法命名规则进行查询,故方法命名中的条件必须是实体类中的属性以便自动识别

    @Autowired
    private ArticleService articleService;
    // 分页 + 排序
    @Test
    public void pageTest(){
        Pageable pageable = PageRequest.of(0,10, Sort.by(Sort.Order.desc("id")));
        Page<Article> page = articleService.findAll(pageable);
        List<Article> list = page.getContent();
        for (Article article : list) {
            System.out.println(article);
        }
    }

    // 分页 + 排序 + 条件
    @Test
    public void conditionTest(){
        String str = "99";
        Pageable pageable = PageRequest.of(0,10, Sort.by(Sort.Order.desc("id")));
        Page<Article> page = articleService.findAll(str,pageable);
        List<Article> list = page.getContent();
        for (Article article : list) {
            System.out.println(article);
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值