十九 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的操作

### 使用指南 #### 集成到 Spring Boot 应用 Easy-ES-Starter 提供了简单而强大的方式,能轻松将 Elasticsearch 集成到 Spring Boot 应用中,进而为应用程序添加强大的搜索功能[^1]。 #### 选择合适版本 推荐使用的 spring data starter es 版本如下: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> <version>2.7.18</version> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> ``` #### ElasticSearchTemplate 的使用示例 以 SpringBoot 3.2.5 + ElasticSearch 8.12.0的环境为例,以下是创建索引库并设置映射的示例代码: ```kotlin @SpringBootTest class ElasticSearchIndexTests { @Resource private lateinit var elasticsearchTemplate: ElasticsearchTemplate @Test fun test1() { // 存在索引库就删除 if (elasticsearchTemplate.indexOps(AlbumInfoDo::class.java).exists()) { elasticsearchTemplate.indexOps(AlbumInfoDo::class.java).delete() } // 创建索引库 elasticsearchTemplate.indexOps(AlbumInfoDo::class.java).create() // 设置映射 elasticsearchTemplate.indexOps(AlbumInfoDo::class.java).putMapping( elasticsearchTemplate.indexOps(AlbumInfoDo::class.java).createMapping() ) } } ``` #### 与 Elasticsearch Logstash 数据通信 可以通过 ESLClient - Spring - Boot - Starter 集成进 Spring Boot 应用,实现与 Elasticsearch Logstash 的数据通信,同时可查看项目的 GitHub 页面获取最新信息和详细使用指南[^2]。 ### 常见问题 文档中未提及 springboot - starter - elasticsearch 的常见问题相关内容。在实际应用中,可根据具体业务需求选择合适的集成方式和优化策略,并持续关注 Elasticsearch 生态的最新发展[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值