SpringBoot整合ElasticSearch7.x

es搭建教程:二选一

其他资料

在这里插入图片描述

本文示例版本

  • spring-boot-starter-parent:2.7.8
  • spring-data-elasticsearch:4.4.7
  • elasticsearch:7.17.3

pom.xml

<parent>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.8</version>
</parent>

<properties>
   <elasticsearch.version>7.17.3</elasticsearch.version>
</properties>

<!--es-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
 </dependency>

application.yml

# es连接地址
spring.elasticsearch.uris: 127.0.0.1:9200

代码示例

TestEsDto

import lombok.Data;
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 954L
 * @create 2023/2/8 15:03
 */
@Data
@Document(indexName = "test_es_dto")
public class TestEsDto {
    
    

    @Id
    private Long id;

    /* 名称;ik_max_word:细粒度分词 */
    @Field(analyzer = "ik_max_word", type = FieldType.Text)
    private String name;

    /* 备注;ik_smart:粗粒度分词 */
    @Field(analyzer = "ik_smart", type = FieldType.Text)
    private String remark;

    /* 内容;ik_max_word:细粒度分词 */
    @Field(analyzer = "ik_max_word", type = FieldType.Text)
    private String content;

    /* 编码 */
    @Field(type = FieldType.Keyword)
    private String code;

    /* 排序值 */
    @Field(type = FieldType.Integer)
    private Integer sortNum;
    
}

TestEsDtoEsRepository

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @author 954L
 * @create 2023/2/8 15:17
 */
@Repository
public interface TestEsDtoEsRepository extends ElasticsearchRepository<TestEsDto, Long> {
    
    

    /**
     * 不需要写具体的实现,函数名遵循命名规范即可自动实现
     * 命名规则参考:https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#repositories.query-methods
     * @param name
     * @return
     */
    List<TestEsDto> findByName(String name);

}

测试类

import com.alibaba.fastjson.JSON;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;

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

/**
 * @author 954L
 * @create 2023/2/8 15:13
 */
@SpringBootTest
class TestEsDtoTest {
    
    

    @Autowired
    private TestEsDtoEsRepository testEsDtoEsRepository;

    /**
     * 测试新增
     */
    @Test
    void testInsert() {
    
    
        // 插入100条数据
        List<TestEsDto> testEsDtoList = new ArrayList<>(100);
        for (int i = 1; i <= 100; i++) {
    
    
            TestEsDto testEsDto = new TestEsDto();
            testEsDto.setId(Long.valueOf(i));
            testEsDto.setName("name-" + i);
            testEsDto.setRemark("我是备注abcdefg");
            testEsDto.setContent("我是内容hijklmnn");
            testEsDto.setCode("CODE");
            testEsDto.setSortNum(i);
            // 单条插入
//            testEsDtoEsRepository.save(testEsDto);
            testEsDtoList.add(testEsDto);
        }
        // 批量插入
        testEsDtoEsRepository.saveAll(testEsDtoList);
    }

    /**
     * 查test_es_dto索引的所有数据
     */
    @Test
    void testFindAll() {
    
    
        Iterable<TestEsDto> testEsDtoIterable = testEsDtoEsRepository.findAll();
        testEsDtoIterable.forEach(x -> System.out.println(JSON.toJSONString(x)));
    }

    /**
     * 修改指定数据
     */
    @Test
    void testUpdate() {
    
    
        TestEsDto testEsDto = testEsDtoEsRepository.findById(1L).orElse(null);
        System.out.println("修改前名称:" + testEsDto.getName());
        testEsDto.setName(testEsDto.getName() + "111222333");
        testEsDtoEsRepository.save(testEsDto);
        testEsDto = testEsDtoEsRepository.findById(1L).orElse(null);
        System.out.println("修改后名称:" + testEsDto.getName());
    }

    /**
     * 删除指定数据
     */
    @Test
    void testDelete() {
    
    
        testEsDtoEsRepository.deleteById(1L);
        TestEsDto testEsDto = testEsDtoEsRepository.findById(1L).orElse(null);
        System.out.println(testEsDto == null? "删除成功": "删除失败");
    }


    @Autowired
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    /**
     * 复杂查询
     */
    @Test
    void testSearch() {
    
    
        // 根据名称查询:方式一
        List<TestEsDto> testEsDtoList = testEsDtoEsRepository.findByName("name-100");
        testEsDtoList.forEach(x -> System.out.println(JSON.toJSONString(x)));

        // 根据名称查询:方式二
        MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("name", "name-100");
        NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(matchQueryBuilder)
            .withFields("id", "name", "remark").build();
        SearchHits<TestEsDto> hits = elasticsearchRestTemplate.search(query, TestEsDto.class);
        List<SearchHit<TestEsDto>> searchHits = hits.getSearchHits();
        System.out.println("共" + searchHits.size() + "条");
        TestEsDto testEsDto = searchHits.get(0).getContent();
        System.out.println(JSON.toJSONString(testEsDto));
    }

}

猜你喜欢

转载自blog.csdn.net/wkh___/article/details/128933852