0
点赞
收藏
分享

微信扫一扫

Elasticsearch学习笔记(四)

芒果六斤半 2022-01-09 阅读 25

Spring Data ElasticSearch整合

什么是Spring Data?

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

Spring Data的官网:Redirecting…

什么是Spring Data ElasticSearch?

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

Spring boot 集成spring data elasticsearch的方式来开发更加的方便和快捷。

步骤:

1.起步依赖
2.配置文件配置连接服务器
3.创建POJO 建立映射关系  @document @field @id
4.创建dao接口继承elasticsearchRepository<Article,Long>

根据需要执行不同的dao的方法。

  创建Maven工程(jar),导入坐标我们已经导入了

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

   创建pojo, 添加注解

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

/**
 * @Author: quanzixiong
 * @Date: 2022/01/09 10:39
 * @Document:放置到类上
 *    indexName = "blog1":表示索引的名称,(小写)
 *    type = "article":表示类型
 * @Id:放置到字段id上
 *    表示该字段的值存放到索引库的_id字段上,表示主键
 * @Field:放置到字段上
 *    store = true:表示该字段的值存储到索引库
 *    index = true:表示该字段的值要建立索引用于搜索
 *    analyzer = "ik_smart":建立索引的时候使用什么分词器
 *    searchAnalyzer = "ik_smart":数据搜索的时候使用什么分词器(可以不写)
 *    type = FieldType.Text:存放字段的数据类型
 */
@Document(indexName = "blog04",type = "article")
public class Article {

    @Id //文档唯一标识
    private Long id;
    @Field(type = FieldType.Text,index = true,store = false,analyzer = "ik_smart",searchAnalyzer = "ik_smart")
    private String title;
    @Field(type= FieldType.Text,index = true,store = false,analyzer = "ik_smart",searchAnalyzer = "ik_smart")
    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;
    }
}

创建Dao接口继承ElasticsearchRepository

import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchCrudRepository;

import java.util.List;

/**
 * @Author: quanzixiong
 * @Date: 2022/01/09 10:49
 * 第一个标识操作的数据类型
 * 第二个标识操作的数据类型的文档唯一标识的数据类型
 */
public interface ArticleDao extends ElasticsearchCrudRepository <Article,Long> {

    //创建文档
    //更新文档 @Highlight
    //查询文档
    //删除文档

    //自定义查询
    List<Article> findByTitle(String title);

    List<Article> findByTitleAndContent(String title,String content);

    @Query("{\"match\": {\"title\": {\"query\": \"?0\"}}}") //dsl语句
    List<Article> abcdefg(String acdf);
}

CRUD:


import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.List;


@SpringBootTest
@RunWith(SpringRunner.class)
public class TestDataEs {

    @Autowired
    private ArticleDao articleDao;

    //核心的类 操作ES的
    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

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

    //创建文档
    @Test
    public void createDocument(){
        List<Article> articles = new ArrayList<>();
        for (long i = 0; i < 100; i++) {
            Article article = new Article(i, "小米手机棒棒棒" + i, "小米电话可可可" + i);
            articles.add(article);
        }
        articleDao.saveAll(articles);
    }

    //更新文档
    //没有id对应的数据,就是新增; 有当前id对应的数据,就是更新

    //删除文档
    @Test
    public void delete(){
        articleDao.deleteById(1L);
    }

    //查询文档
    @Test
    public void select(){
        /*Iterable<Article> all = articleDao.findAll();



        //分页查询

        //参数1 指定排序的类型
        //参数2 指定排序的字段
        Sort sort = new Sort(Sort.Direction.DESC,"id");
        //参数1 指定当前的页码 0 表示第一个页
        //参数2 指定每页显示的行
        //参数3 指定排序对象
        Pageable pageble = PageRequest.of(0,10,sort);
        Page<Article> page = articleDao.findAll(pageble);


        long totalElements = page.getTotalElements();
        System.out.println(totalElements);
        int totalPages = page.getTotalPages();
        System.out.println(totalPages);


        System.out.println("==============");
        List<Article> content = page.getContent();//当前的页的记录
        for (Article article : content) {
            System.out.println(article.getTitle());
        }*/

        //获取列表记录
       /* for (Article article : all) {
            System.out.println(article.getTitle());
        }*/

        //自定义查询
        List<Article> articles = articleDao.findByTitle("手机");
        for (Article article : articles) {
            System.out.println(article.getTitle());
        }
    }
}
举报

相关推荐

0 条评论