首页 > 编程语言 > 详细

SpringBoot支持SpringData es

时间:2020-02-21 00:57:48      阅读:108      评论:0      收藏:0      [点我收藏+]

ElasticSearch CRUD

1.springboot springData es

 spring data

         是spring对数据访问抽象.这些数据可以放入db,index,nosql等包含以下:

          spring data jpa spring对关系型数据库访问支持

          spring data ES  spring对es数据访问支持

spring data redis等 spring对redis数据访问支持

spring data .....

 

springboot springdata xxxx

     spring data es

        是spring对Es数据访问.和原来spring data jpa对db访问.

     springboot spring data es

        对 spring data es简化了配置.

2.入门

启动你的elasticsearch

2.1 依赖

注意:我这里使用了lombok

<!--springboot版本仲裁中心-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.5.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <!--springboot 对spring data es支持-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.8</version>
        <scope>provided</scope>
    </dependency>

</dependencies>

 

 

1.1 配置application.yml

spring:
  data:
    elasticsearch:
      cluster-name: elasticsearch #指定elasticsearch集群名称
      cluster-nodes: localhost:9300 #9200是图形化界面端 9300是代码端

2.3 入口

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

 

2.4 创建索引文件

注意:索引库名字只能全部是小写

技术分享图片
package cn.dyier.doc;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
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;

/**
 * person索引库
 * 现在ES Doc @Document(index,type) @Id @Feild 建立的是对象与文档直接映射
 * 操作的时wwjEsTest索引库下的person文档
 * @author Lenovo
 */
@Document(indexName = "wwjestest", type="person")
@NoArgsConstructor
@Getter
@Setter
@ToString(exclude = {"all"})
public class PersonDoc {
    /**
     * 文档的id就是对象的id
     */
    @Id
    private Long id;

    /**
     * 没有特殊要求不用@Field
     */
    private Integer age;

    /**
     * keyword不分词
     */
    @Field(type = FieldType.Keyword)
    private String name;

    /**
     * 指定分词类型,分词器,搜索器
     */
    @Field(type = FieldType.Text,
            analyzer = "ik_max_word", searchAnalyzer = "ik_max_word")
    private String intro;

    /**
     * 关键字搜索,指定作用于intro 和 name字段
     * 虚拟字段all(所有需要做关键字搜索的值,中间通过空格分隔) zs +" "+ zs is .相当于一个字段代替了很多字段
     */
    @Field(type = FieldType.Text,
            analyzer = "ik_max_word", searchAnalyzer = "ik_max_word")
    private String all;

    /**
     * 进行拼接
     * @return 返回拼接后的结果
     */
    public String getAll() {
        return this.name + " " + this.intro;
    }

    public PersonDoc(Long id, Integer age, String name) {
        this.id = id;
        this.age = age;
        this.name = name;
    }
}
PersonDoc

 

 

2.5 repository配置

技术分享图片
public interface PersonDocRepository extends
        ElasticsearchRepository<PersonDoc, Long> {
}
PersonDocRepository

 

2.6 创建索引库,添加类型映射,crud,高级查询,排序,分页

技术分享图片
package cn.dyier;

import cn.dyier.doc.PersonDoc;
import cn.dyier.repository.PersonDocRepository;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.sort.SortBuilders;
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.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.FetchSourceFilter;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = EsApplication.class)
public class EsTest {
    //所有的操作都是通过ElasticsearchTemplate
    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    @Autowired
    private PersonDocRepository personDocRepository;

    /**
     * 创建索引库,类型映射 curd(Repository)
     * @throws Exception
     */
    @Test
    public void init() throws Exception {
        System.out.println(elasticsearchTemplate);
        //创建索引库
        elasticsearchTemplate.createIndex(PersonDoc.class);
        //类型映射
        elasticsearchTemplate.putMapping(PersonDoc.class);
    }

    /**
     * 添加或者修改 save
     * id在索引库中存在就是修改
     * @throws Exception
     */
    @Test
    public void testAddOrUpdate() throws Exception {
        PersonDoc personDoc = new PersonDoc(1L, 17, "wwj_test01");
        personDoc.setIntro("这是测试的第一个");
        personDocRepository.save(personDoc);
    }

    /**
     * 批量添加 saveAll
     * @throws Exception
     */
    @Test
    public void testAddAll() throws Exception {
        ArrayList<PersonDoc> personDocs = new ArrayList<>();
        for (int i = 0; i < 50; i++) {
            PersonDoc personDoc = new PersonDoc(2L + i, 19 + i, "wwj_" + i);
            personDoc.setIntro("wwj_intro_" + i);
            personDocs.add(personDoc);
        }
        personDocRepository.saveAll(personDocs);
    }

    /**
     * 根据id删除一个 deleteById()
     * @throws Exception
     */
    @Test
    public void testDeleteById() throws Exception {
        personDocRepository.deleteById(14L);
    }

    /**
     * 根据id获取 一个
     * @throws Exception
     */
    @Test
    public void testFindOne() throws Exception {
        System.out.println(personDocRepository.findById(1L));
    }

    /**
     * 查询所有
     * @throws Exception
     */
    @Test
    public void testFindAll() throws Exception {
        personDocRepository.findAll().forEach(System.out::println);
    }

    /**
     * dsl分页+高级查询+排序
     * @throws Exception
     */
    @Test
    public void testDsl() throws Exception {
        //1.创建一个构造器 NativeSearchQueryBuilder
        NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
        //2.设置条件 QueryBuilders.boolQuery()
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        //2.1 must 必须 all字段包含wwj
        boolQueryBuilder.must(QueryBuilders.matchQuery("all", "wwj"));
        //2.2 filter 过滤 gte大于等于 lte小于等于
        boolQueryBuilder.filter(QueryBuilders.rangeQuery("age").gte(20).lte(50));
        builder.withQuery(boolQueryBuilder);
        //3.排序 根据id排序
        builder.withSort(SortBuilders.fieldSort("id"));
        //4.分页 页数从0开始
        builder.withPageable(PageRequest.of(0, 10));
        //5.截取字段
        builder.withSourceFilter(new FetchSourceFilter(
                new String[]{"id", "name", "age"}, null));
        //6.查询并封装结果
        NativeSearchQuery build = builder.build();
        //当前页数据
        Page<PersonDoc> page = personDocRepository.search(build);
        //总数
        System.out.println(page.getTotalElements());
        //当前页数据
        System.out.println(page.getContent());
    }
}
精髓..

 

SpringBoot支持SpringData es

原文:https://www.cnblogs.com/dyier/p/12339760.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!