十九 Springboot-集成elastic search

本文介绍了如何在Spring Boot项目中集成Elasticsearch,并利用Spring Data Elasticsearch进行数据操作。包括环境搭建、基本配置以及通过代码实现增删改查等功能。

19.1 准备elastic search

19.1.1 是什么

​ 是一个全文搜索服务器

19.1.2 简单使用

​ 以windows为例进行简单使用

19.1.2.1 下载

​ elasticsearch

​ kibana

​ elasticsearch ik分词器

在这里插入图片描述

19.1.2.2 安装
  1. 安装elasticsearch

    直接解压就OK

  2. 配置elasticsearch及ik分词器

    修改jvm参数

    image-20201227141953682

    解压拷贝到es plugins下面

    image-20201227141847489

  3. 安装客户端kibana

    ​ 直接解压就OK

    image-20201227142132168

  4. 测试

    ​ 启动es

    image-20201227142159639

    ​ 启动kibana进行测试

    image-20201227142211639

    image-20201227142229894

19.2 Springboot操作elastic search-方案选择

19.2.1 原生ESTransport Client方式

​ 就相当于写jdbc代码,非常麻烦.

19.2.2 springboot springdata elastic search

​ spring data

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

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

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

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

​ spring data …

springboot spring data es

 对 spring data es简化了配置.

采纳它,比较简单

19.3 springboot springdata elasticsearch入门

步骤分析:
1 准备一个springboot项目
2 在springboot中导入spring data elastic search的strarter
3 application.yml中进行配置
4 写代码测试

19.3.1 准备一个springboot项目

​ 略过

19.3.2 springboot中导入spring data elasticsearch的strarter

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

19.3.3 application.yml中进行配置

spring:
  data:
    elasticsearch:
      cluster-name: elasticsearch
      cluster-nodes: 127.0.0.1:9300 #9200是图形界面端,9300代码端

19.3.4 写代码测试

package org.yaosang.doc;

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;

@Document(indexName = "crm",type = "person")
public class Person {
    @Id
    private Long id;

    private String name; // zs

    private Integer age;

    private String intro; //zs is disaosi

    @Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String all; //所有要做模块查询的字段值通过“ ”隔开 zs  zs is disaosi

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getIntro() {
        return intro;
    }

    public void setIntro(String intro) {
        this.intro = intro;
    }

    public String getAll() {
        return name+" "+intro;
    }

    public void setAll(String all) {
        this.all = all;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", intro='" + intro + '\'' +
                ", all='" + all + '\'' +
                '}';
    }

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

    public Person() {
    }
}

package org.yaosang.repository;

import cn.itsource.doc.Person;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface PersonRepository extends ElasticsearchRepository<Person,Long> {
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes = EsApplication.class)
public class EsTest {
    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    @Autowired
    private PersonRepository repository;
    @Test
    public void testInit() throws Exception{
        System.out.println(elasticsearchTemplate);
        elasticsearchTemplate.createIndex(Person.class); //创建索引库
        elasticsearchTemplate.putMapping(Person.class);//创建自定义映射
    }

    @Test
    public void testAdd() throws Exception{
        repository.save(new Person(1L,"zs",18,"zs is nb ren!"));
    }
    @Test
    public void testAddAll() throws Exception{
        List<Person> persons = new ArrayList<>();
        for (int i = 0; i < 50; i++) {
            persons.add(new Person(i+2L,"zs"+i,19+i,"zs "+i+" dbl ddh"));
        }
        repository.saveAll(persons);
    }

    @Test
    public void testGetOne() throws Exception{

        Optional<Person> optional = repository.findById(1L);
        Person person = optional.get();
        System.out.println(person);
    }
    @Test
    public void testGetAll() throws Exception{

        Iterable<Person> all = repository.findAll();
        Iterator<Person> iterator = all.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

    @Test
    public void testDel() throws Exception{
        repository.deleteById(50L);
        //repository.deleteAll();
        Optional<Person> person = repository.findById(50L);
        System.out.println(person.get());

    }

    @Test
    public void testUpdate() throws Exception{
        Optional<Person> optional = repository.findById(49L);
        Person person = optional.get();
        System.out.println(person);
        person.setName(person.getName()+" edit");
        repository.save(person);
        repository.findById(49L);
        person = optional.get();
        System.out.println(person);

    }

    //dsl
    /**{
     "query": {
        "bool": { 与(must) 或(should) 非(must not)
            "must": [
                 {"match": {"description": "search" }}
     ],
            "filter": {
             "term": {"tags": "lucene"}
             }
     }
     },
     "from": 20,
     "size": 10,
     "_source": ["fullName", "age", "email"],
     "sort": [{"join_date": "desc"},{"age": "asc"}]
     }
     * */
    // select id,name from t_user where name like %xxx% order by id desc limit 0,10
    @Test
    public void testDsl() throws Exception{
        NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
        //1 查询+过滤
        BoolQueryBuilder bool = QueryBuilders.boolQuery(); //query bool
        bool.must(QueryBuilders.matchQuery("all","zs")); //query bool must match
        bool.filter(QueryBuilders.rangeQuery("age").lte(40).gte(20));//query bool filter
        builder.withQuery(bool);
        //2 排序
        builder.withSort(SortBuilders.fieldSort("age").order(SortOrder.DESC));//通过age倒序排列
        //3 分页
        builder.withPageable(PageRequest.of(0,10));//当前页,每页显示多少个。
        //4 截取字段
        builder.withSourceFilter(new FetchSourceFilter(new String[]{"name","age","id"},
                null));
        //5 获取
        Page<Person> page = repository.search(builder.build());
        System.out.println("总页数:"+page.getTotalPages());
        System.out.println("总数:"+page.getTotalElements());
        for (Person person : page.getContent()) {
            System.out.println(person);
        }
    }

}

19.3 小结

​ 本章节讲解了springboot通过spring data elasticsearch完成了对elasticsearch的操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值