elasticsearch学习二

第二章Spring Data ElasticSearch

1.Spring Data ElasticSearch简介

1.1什么是Spring Data

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

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

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

1552828591302

1552828597851

1.2什么是Spring Data 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.Spring Data ElasticSearch入门

2.1需求

需求: 保存Article

步骤:

  1. 创建Maven工程(jar),在pom文件导入坐标
  2. 创建pojo, 添加注解
  3. 创建Dao接口继承ElasticsearchRepository
  4. 创建配置文件进行配置
  5. 测试

2.2代码实现

  • 创建Maven工程(jar),导入坐标
    <dependencies>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>5.6.8</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>5.6.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-to-slf4j</artifactId>
            <version>2.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.24</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>3.0.7.RELEASE</version>
        </dependency>
    </dependencies>
  • 创建pojo, 添加注解
/**
 * @Document:放置到类上
 *    indexName = "blog1":表示索引的名称,(小写)
 *    type = "article":表示类型
 * @Id:放置到字段id上
 *    表示该字段的值存放到索引库的_id字段上,表示主键
 * @Field:放置到字段上
 *    store = true:表示该字段的值存储到索引库
 *    index = true:表示该字段的值要建立索引用于搜索
 *    analyzer = "ik_smart":建立索引的时候使用什么分词器
 *    searchAnalyzer = "ik_smart":数据搜索的时候使用什么分词器(可以不写)
 *    type = FieldType.Text:存放字段的数据类型
 */
@Document(indexName = "blog03",type = "article")
public class Article implements Serializable {

    @Id
    private Long id;

    @Field(index = true,searchAnalyzer = "ik_smart",analyzer = "ik_smart",store = true,type = FieldType.Text)
    private String title;

    @Field(index = true,searchAnalyzer = "ik_smart",analyzer = "ik_smart",store = true,type = FieldType.Text)
    private String content;

    public Article() {
    }
    public Article(long id, String title, String content) {
        this.id = id;
        this.title = title;
        this.content = content;
    }


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Override
    public String toString() {
        return "Article{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", content='" + content + '\'' +
                '}';
    }
}

 

  • 创建Dao接口继承ElasticsearchRepository
public interface ArticleDao  extends ElasticsearchRepository<Article,Long>{

}
  • 创建配置文件进行配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/data/elasticsearch http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.itheima"></context:component-scan>

    <!-- 1:扫描Dao包,自动创建实例,扫描所有继承ElasticsearchRepository接口的接口 -->
    <elasticsearch:repositories base-package="com.itheima.dao"></elasticsearch:repositories>
    <!--2.配置elasticSearch的连接-->
    <elasticsearch:transport-client id="client" cluster-nodes="127.0.0.1:9300" cluster-name="elasticsearch"></elasticsearch:transport-client>
    <!--3.注册模版-->
    <bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
        <constructor-arg name="client" ref="client"></constructor-arg>
    </bean>
</beans>

 

  • 测试
@RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class EsTest {

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    @Autowired
    private ArticleDao articleDao;

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

    @Test
    //保存文章
    public void fun02(){
        Article article = new Article(1, "测试title", "测试内容");
        articleDao.save(article);
    }

}

 

3.Spring Data ElasticSearch常见操作

3.1CRUD

  • 新增,
@Test
//保存文章
public void fun02(){
  Article article = new Article(1, "测试title", "测试内容");
  articleDao.save(article);
}

 

  • 删除
@Test
//删除
public void fun03(){
    articleDao.deleteById(4L);
}

 

  • 更新; 没有id对应的数据,就是新增; 有当前id对应的数据,就是更新
    @Test
    //修改
    public void fun04(){
        Article article = new Article(4, "测试标题4", "测试内容4");
        articleDao.save(article);
    }

 

  • 根据id查询
    @Test
    //根据id查询
    public void fun05(){
        Article article = articleDao.findById(1L).get();
        System.out.println(article);
    }
  • 查询所有
 
    @Test
    //根据所有
    public void fun06(){
        Iterable<Article> iterable = articleDao.findAll();
        for (Article article : iterable) {
            System.out.println(article);
        }
    }
  • 排序查询
    @Test
    //排序
    public void fun07(){
        Iterable<Article> iterable = articleDao.findAll( Sort.by(Sort.Order.asc("id")));
        for (Article article : iterable) {
            System.out.println(article);
        }
    }

 

  • 分页查询
    @Test
    //分页查询
    public void fun08(){
        Pageable pageable = PageRequest.of(0,2);
        Page<Article> page = articleDao.findAll(pageable);
        System.out.println("总数量="+page.getTotalPages());
        System.out.println("结果="+page.getContent());
    }

 

3.2自定义查询

  • 常用查询命名规则
关键字命名规则解释示例
and findByField1AndField2 根据Field1和Field2获得数据 findByTitleAndContent
or findByField1OrField2 根据Field1或Field2获得数据 findByTitleOrContent
is findByField 根据Field获得数据 findByTitle
not findByFieldNot 根据Field获得补集数据 findByTitleNot
between findByFieldBetween 获得指定范围的数据 findByPriceBetween
lessThanEqual findByFieldLessThan 获得小于等于指定值的数据 findByPriceLessThan
  • 测试
public interface ArticleDao  extends ElasticsearchRepository<Article,Long>{

    //根据title模糊查询
    List<Article> findByTitleLike(String title);

    //根据title模糊查询,根据id降序
    List<Article> findByTitleLikeOrderByIdAsc(String title);

    //模块查询,排序加分页
    Page<Article> findByTitleLikeOrderByIdAsc(String title,Pageable pageable);

}

 

posted @ 2020-04-02 23:39  自然的风和雨  阅读(119)  评论(0编辑  收藏  举报