SpringData Elasticsearch

 SpringData Elasticsearch

2.1 目标

2.2 讲解

2.2.1 SpringDataJpa介绍

JPA是一个规范,真正操作数据库的是Hibernate,而springdatajpa是对jpa的封装,将CRUD的方法封装到指定的方法中,操作的时候,只需要调用方法即可。

Spring Data Jpa的实现过程:


1:定义实体,实体类添加Jpa的注解
2:定义接口,接口要继承JpaRepository的接口
3:配置spring容器,applicationContext.xml

2.2.2 Spring Data ElasticSearch简介

(1)SpringData介绍

Spring Data是一个用于简化数据库、非关系型数据库、索引库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。 Spring Data可以极大的简化JPA(Elasticsearch…)的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。

Spring Data的官网:http://projects.spring.io/spring-data/

Spring Data常用的功能模块如下:

SpringData Elasticsearch_第1张图片

SpringData Elasticsearch_第2张图片

(2)SpringData Elasticsearch介绍

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

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

2.2.3 SpringData Elasticsearch入门

2.2.3.1 搭建工程

(1)搭建工程

工程坐标如下:


com.itheima
elasticsearch-day2-demo2-springdata-es
1.0-SNAPSHOT

(2)pom.xml依赖




    4.0.0

    com.itheima
    elasticsearch-day2-demo2-springdata-es
    1.0-SNAPSHOT

    
    
        
        
            org.elasticsearch
            elasticsearch
            5.6.8
        
        
            org.elasticsearch.client
            transport
            5.6.8
        

        
        
            org.apache.logging.log4j
            log4j-to-slf4j
            2.9.1
        
        
            org.slf4j
            slf4j-api
            1.7.24
        
        
            org.slf4j
            slf4j-simple
            1.7.21
        
        
            log4j
            log4j
            1.2.12
        

        
        
            junit
            junit
            4.12
        
        
            org.springframework
            spring-test
            5.0.8.RELEASE
        

        
        
            org.springframework.data
            spring-data-elasticsearch
            3.0.7.RELEASE
        
    

2.2.3.2 增加索引数据

(1)编写实体类

创建com.itheima.domain.Article,代码如下:


public class Article {

    private Integer id;
    private String title;
    private String content;
    //..set..get..toString   
}

(2)Dao创建

创建com.itheima.es.dao.ArticleDao,代码如下:


public interface ArticleDao extends ElasticsearchRepository {
}

(3)创建Service

创建com.itheima.service.ArticleService接口,并添加一个保存数据方法,代码如下:


public interface ArticleService {

    /***
     * 增加数据
     * @param article
     */
    void save(Article article);
}

创建com.itheima.service.impl.ArticleServiceImpl,并实现保存数据的方法,代码如下:


@Service
public class ArticleServiceImpl implements ArticleService {

    @Autowired
    private ArticleDao articleDao;

    /***
     * 增加数据
     * @param article
     */
    @Override
    public void save(Article article) {
        articleDao.save(article);
    }
}

(4)配置映射

修改com.itheima.domain.Article配置索引映射关系,代码如下:


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

    //@Id 文档主键 唯一标识
    @Id
    private Integer id;
    @Field(index = true,analyzer = "ik_smart",store=false,searchAnalyzer="ik_smart",type = FieldType.Text)
    private String title;
    @Field(index = true,analyzer = "ik_smart",store=false,searchAnalyzer="ik_smart",type = FieldType.Text)
    private String content;
    
    //..get..set..toString
}

其中,注解解释如下:
@Document(indexName=“blob4”,type=“article”):
indexName:索引的名称(必填项)
type:索引的类型
@Id:主键的唯一标识
@Field(index=true,analyzer=“ik_smart”,store=true,searchAnalyzer=“ik_smart”,type = FieldType.Text)
index:是否设置分词
analyzer:存储时使用的分词器
searchAnalyze:搜索时使用的分词器
store:是否存储,默认值是false。如果默认设置为false,Elasticsearch默认使用_source存放我们数据内容。
type: 数据类型

(5)核心配置文件配置

在resources下创建springdata-es.xml,在配置文件中配置包扫描以及ESDao包扫描,TransportClient对象创建,elasticsearchTemplate对象创建,代码如下:





    
    

    
    

    
    

    
    
        
    

(6)创建测试类

创建测试类com.itheima.test.SpringDataEsTest,代码如下:


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:springdata-es.xml")
public class SpringDataEsTest {

    @Autowired
    private ArticleService articleService;

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    /**
     * 创建索引和映射信息
     */
    @Test
    public void testCreateMapping(){
        elasticsearchTemplate.createIndex(Article.class);
        elasticsearchTemplate.putMapping(Article.class);
    }

    /**
     * 添加文档数据
     */
    @Test
    public void testSave(){
        Article article = new Article();
        article.setId(100);
        article.setTitle("测试SpringData ElasticSearch");
        article.setContent("Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API 进行封装Spring Data为Elasticsearch Elasticsearch项目提供集成搜索引擎");
        articleService.save(article);
    }
}

查看elasticsearch-head,索引如下:

SpringData Elasticsearch_第3张图片

数据如下:

2.2.4 SpringData Elasticsearch常用操作

使用SpringDataElasticsearch实现数据的增删改查操作。

2.2.4.1 Service层

(1)Service接口

修改com.itheima.service.ArticleService,添加更多操作方法:


public interface ArticleService {

    /***
     * 增加数据
     * @param article
     */
    void save(Article article);

    /**
     * 批量保存
     * @param articles
     */
    void saveAll(List
articles); /** * 根据ID删除数据 * @param article */ void delete(Article article); /** * 查询所有 * @return */ Iterable
findAll(); /** * 分页查询 * @param pageable:分页封装对象 * @return */ Page
findAll(Pageable pageable); }

(2)Service实现类

修改com.itheima.service.impl.ArticleServiceImpl实现上面添加的接口方法,代码如下:


@Service
public class ArticleServiceImpl implements ArticleService {

    @Autowired
    private ArticleDao articleDao;

    /***
     * 增加数据
     * @param article
     */
    @Override
    public void save(Article article) {
        articleDao.save(article);
    }

    /**
     * 批量保存
     * @param articles
     */
    @Override
    public void saveAll(List
articles) { articleDao.saveAll(articles); } /** * 根据ID删除数据 * @param article */ @Override public void delete(Article article) { articleDao.delete(article); } /** * 查询所有 * @return */ @Override public Iterable
findAll() { return articleDao.findAll(); } /** * 分页查询 * @param pageable:分页封装对象 * @return */ @Override public Page
findAll(Pageable pageable) { return articleDao.findAll(pageable); } }

2.2.4.2 测试

修改com.itheima.test.SpringDataEsTest,将刚才添加的方法一一测试:


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:springdata-es.xml")
public class SpringDataEsTest {

    @Autowired
    private ArticleService articleService;

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    /**
     * 创建索引和映射信息
     */
    @Test
    public void testCreateMapping(){
        elasticsearchTemplate.createIndex(Article.class);
        elasticsearchTemplate.putMapping(Article.class);
    }

    /**
     * 添加文档数据
     */
    @Test
    public void testSave(){
        Article article = new Article();
        article.setId(100);
        article.setTitle("测试SpringData ElasticSearch");
        article.setContent("Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API 进行封装Spring Data为Elasticsearch Elasticsearch项目提供集成搜索引擎");
        articleService.save(article);
    }


    /**
     * 更新测试
     */
    @Test
    public void testUpdate(){
        Article article = new Article();
        article.setId(100);
        article.setTitle("elasticSearch 3.0版本发布...更新");
        article.setContent("ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口");
        articleService.save(article);
    }


    /**
     * 批量保存
     */
    @Test
    public void testSaveAll(){
        List
articles = new ArrayList
(); for (int i = 0; i <100 ; i++) { Article article = new Article(); article.setId(i+1); article.setTitle((i+1)+"elasticSearch 3.0版本发布...更新"); article.setContent((i+1)+"ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口"); articles.add(article); } articleService.saveAll(articles); } /*** * 根据ID删除 */ @Test public void testDelete(){ Article article = new Article(); article.setId(100); articleService.delete(article); } /** * 查询所有 */ @Test public void testFindAll(){ //查询所有 Iterable
articles = articleService.findAll(); for (Article article : articles) { System.out.println(article); } } /** * 分页查询 */ @Test public void testFindAllPage(){ //分页查询 Page
page = articleService.findAll(PageRequest.of(0, 3)); //总记录数 long totalElements = page.getTotalElements(); //总页数 int totalPages = page.getTotalPages(); //获取数据 List
articles = page.getContent(); for (Article article : articles) { System.out.println(article); } } }

2.2.5 常用查询命名规则

关键字 命名规则 解释 示例
and  findByField1AndField2  根据Field1和Field2获得数据  findByTitleAndContent 
or  findByField1OrField2  根据Field1或Field2获得数据  findByTitleOrContent 
is  findByField  根据Field获得数据  findByTitle 
not  findByFieldNot  根据Field获得补集数据  findByTitleNot 
between  findByFieldBetween  获得指定范围的数据  findByPriceBetween 
lessThanEqual  findByFieldLessThan  获得小于等于指定值的数据  findByPriceLessThan 

2.2.5.1 根据标题查询

(1)Dao层

修改com.itheima.es.dao.ArticleDao添加一个根据标题查询方法:


/***
 * 根据标题查询
 * @param title
 * @return
 */
List
findByTitle(String title);

(2)Service层

修改com.itheima.service.ArticleService,添加一个根据标题查询方法,代码如下:


/***
 * 根据标题查询数据
 * @param title
 * @return
 */
List
findByTitle(String title);

修改com.itheima.service.impl.ArticleServiceImpl,添加根据标题查询实现方法,代码如下:


/***
 * 根据标题查询数据
 * @param title
 * @return
 */
@Override
public List
findByTitle(String title) { return articleDao.findByTitle(title); }

(3)测试


/**
 * 根据标题查询
 */
@Test
public void testFindByTitle(){
    //查询所有
    List
articles = articleService.findByTitle("版本"); for (Article article : articles) { System.out.println(article); } }

结果如下:


Article{id=19, title='19elasticSearch 3.0版本发布...更新', content='19ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口'}
Article{id=22, title='22elasticSearch 3.0版本发布...更新', content='22ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口'}
Article{id=24, title='24elasticSearch 3.0版本发布...更新', content='24ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口'}
Article{id=25, title='25elasticSearch 3.0版本发布...更新', content='25ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口'}

2.2.5.2 根据标题分页查询

(1)Dao层

修改com.itheima.es.dao.ArticleDao添加一个根据标题分页查询方法:


/***
 * 根据标题分页查询
 */
Page
findByTitle(String title, Pageable pageable);

(2)Service层

修改com.itheima.service.ArticleService,添加一个根据标题分页查询方法,代码如下:


/***
 * 根据标题分页查询数据
 * @param title
 * @param pageable
 * @return
 */
Page
findByTitle(String title,Pageable pageable);

修改com.itheima.service.impl.ArticleServiceImpl,添加根据标题分页查询实现方法,代码如下:


/***
 * 根据标题分页查询数据
 * @param title
 * @param pageable
 * @return
 */
@Override
public Page
findByTitle(String title, Pageable pageable) { return articleDao.findByTitle(title,pageable); }

(3)测试


/**
 * 根据标题分页查询
 */
@Test
public void testFindByTitlePage(){
    //查询所有
    Page
page = articleService.findByTitle("版本", PageRequest.of(0, 20)); //获取集合数据 List
articles = page.getContent(); for (Article article : articles) { System.out.println(article); } }

结果如下:

SpringData Elasticsearch_第4张图片

 

你可能感兴趣的:(Elasticsearch)