springboot如何整合elasticsearch

 更新时间:2023年04月26日 15:03:47   作者:码里法  
这篇文章主要介绍了springboot如何整合elasticsearch问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

前言

推荐首先查看spring boot对应elasticsearch版本,选择合适的版本整合,推荐以spring boot版本为主,因为项目中集成的框不止是es,根据spring boot去安装对应版本的es。

Spring Data Elasticsearch - 参考文档,这是官方文档,建议一定参照文档,这个文档真的很详细。

另外,springboot操作elasticsearch有两种常用方式:

不管使用哪一种,文章开头的参考文档地址里边都有详细介绍,可以下载一个浏览器翻译插件,这样看起来更轻松。

Spring Data Elasticsearch

这是Spring官方最推荐的,就像JPA,Mybatisplus一样,在DAO层继承ElasticsearchRepository接口,就可以使用封装好的一些常见的操作了,用起来简单方便。

ElasticsearchRestTemplate

封装的就是High Level REST Client,这是基于HTTP协议的客户端,是ES官方推荐使用的,也是可以使用的,但是要求对ES的DSL语句熟悉,方便自己做复杂的增删改查。

不同方式演示

首先需要搞清楚映射关系,参考官方文档这部分,内容过多,就不一一写了。

简单看一下

注解:@Document用来声明Java对象与ElasticSearch索引的关系

  • indexName 索引名称(是字母的话必须是小写字母)
  • type 索引类型
  • shards 主分区数量,默认5
  • replicas 副本分区数量,默认1
  • createIndex 索引不存在时,是否自动创建索引,默认true 不建议自动创建索引(自动创建的索引 是按着默认类型和默认分词器)

注解:@Id 表示索引的主键

注解:@Field 用来描述字段的ES数据类型,是否分词等配置,等于Mapping描述

  • index 设置字段是否索引,默认是true,如果是false则该字段不能被查询
  • store 标记原始字段值是否应该存储在 Elasticsearch 中,默认值为false,以便于快速检索。虽然store占用磁盘空间,但是减少了计算。
  • type 数据类型(text、keyword、date、object、geo等)
  • analyzer 对字段使用分词器,注意一般如果要使用分词器,字段的type一般是text。
  • format 定义日期时间格式

注解:@CompletionField 定义关键词索引 要完成补全搜索

  • analyzer对字段使用分词器,注意一般如果要使用分词器,字段的type一般是text。
  • searchAnalyzer显示指定搜索时分词器,默认是和索引是同一个,保证分词的一致性。
  • maxInputLength设置单个输入的长度,默认为50 UTF-16 代码点

集成先决配置

依赖包

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

yml简单配置

server:
  port: 8082
spring:
  elasticsearch:
    rest:
      uris: 192.168.25.131:9200

实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
//indexName名字如果是字母那么必须是小写字母
@Document(indexName = "student")
public class Student {

    @Id
    @Field(store = true, type = FieldType.Keyword)
    private String sId;

    @Field(store = true, type = FieldType.Keyword)
    private String sName;

    @Field(store = true, type = FieldType.Text, analyzer = "ik_smart")
    //Text可以分词 ik_smart=粗粒度分词 ik_max_word 为细粒度分词
    private String sAddress;

    @Field(index = false, store = true, type = FieldType.Integer)
    private Integer sAge;

    @Field(index = false, store = true, type = FieldType.Date, format = DateFormat.basic_date_time)
    private Date sCreateTime;

    @Field(type = FieldType.Keyword)
    private String[] sCourseList; //数组类型 由数组中第一个非空值决定(这里数组和集合一个意思了)

    @Field(type = FieldType.Keyword)
    private List<String> sColorList; //集合类型 由数组中第一个非空值决定

}

Spring Data Elasticsearch方式

先看文档了解一下定义接口方法的规则吧,前边说过,这种方式就是类似JPA和Mybatisplus的方式,所以不难理解哈。

定义mapper

/**
 * @author: zhouwenjie
 * @description:
 * @create: 2022-05-12 17:37
 * ElasticsearchRepository<T, ID> T:实体类泛型,ID:实体类主键类型
 **/
public interface StudentMapper extends ElasticsearchRepository<Student, String> {
}

使用es自带的一些增删改查方法

如下图,可以看到ElasticsearchRepository本身自带了一些简单curd方法。

测试

@Resource
    StudentMapper studentMapper;

    @Test
    void contextLoads3() {
        Optional<Student> optionalStudent = studentMapper.findById("2");
        System.out.println(optionalStudent.get());
        
    }

使用自定义的方法

规则参考官网的这部分

自定义方法

/**
 * @author: zhouwenjie
 * @description:
 * @create: 2022-05-12 17:37
 * ElasticsearchRepository<T, ID> T:实体类泛型,ID:实体类主键类型
 **/
public interface StudentMapper extends ElasticsearchRepository<Student, String> {
	//提示方法名SName,但是s是小写sName才可以
    List<Student> findStudentBysName(String name);
}

测试

@Test
    void contextLoads3() {
        List<Student> students = studentMapper.findStudentBysName("fff");
        System.out.println(students);
    }

好了,测试到此为止,更多需求可以参照官方文档自行实现。

ElasticsearchRestTemplate方式

返回结果,参照官方说明:

添加

@Test
void contextLoads2() {
    List<String> colorList = new ArrayList<>();//颜色
    colorList.add("red");
    colorList.add("white");
    colorList.add("black");
    Student student = new Student("1", "mhh", "济南", 12, new Date(), new String[]{"语文", "数学", "英语"}, colorList);
    Student save = restTemplate.save(student);
    System.out.println(save);
}

查询

@Test
    void contextLoads() {
        Criteria criteria = new Criteria("sName").is("mhh").and("sAddress").is("济南");
        Query query = new CriteriaQuery(criteria);
        SearchHits<Student> mapSearchHits = restTemplate.search(query, Student.class, IndexCoordinates.of("student"));
        List<SearchHit<Student>> searchHits = mapSearchHits.getSearchHits();
        for (SearchHit<Student> searchHit : searchHits) {
            Student student = searchHit.getContent();
            System.out.println(student);
        }
    }

更新

 @Test
    void contextLoads2() {
        HashMap<String, Object> map = new HashMap<>();
        map.put("sName","fff");
        UpdateQuery.Builder builder = UpdateQuery.builder("1").withDocument(Document.from(map));
        UpdateResponse update = restTemplate.update(builder.build(), IndexCoordinates.of("student"));
        System.out.println(update);
    }

删除

 @Test
    void contextLoads2() {
        String delete = restTemplate.delete("1",IndexCoordinates.of("student"));
        System.out.println(delete);
    }

这些演示都是最简单的,根据实际情况推荐大家去官网查询更多复杂用法。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring集成Druid连接池及监控配置的全过程

    Spring集成Druid连接池及监控配置的全过程

    java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,有不得不使用数据库连接池,下面这篇文章主要给大家介绍了关于Spring集成Druid连接池及监控配置的相关资料,需要的朋友可以参考下
    2021-09-09
  • Java中break的第三种用法说明

    Java中break的第三种用法说明

    这篇文章主要介绍了Java中break的第三种用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • 解析SpringBoot 搭建基于 MinIO 的高性能存储服务的问题

    解析SpringBoot 搭建基于 MinIO 的高性能存储服务的问题

    Minio是Apache License v2.0下发布的对象存储服务器,使用MinIO构建用于机器学习,分析和应用程序数据工作负载的高性能基础架构。这篇文章主要介绍了SpringBoot 搭建基于 MinIO 的高性能存储服务,需要的朋友可以参考下
    2022-03-03
  • SpringMVC通过注解获得参数的实例

    SpringMVC通过注解获得参数的实例

    下面小编就为大家带来一篇SpringMVC通过注解获得参数的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • IDEA实用好用插件推荐及使用方法教程详解(必看)

    IDEA实用好用插件推荐及使用方法教程详解(必看)

    这篇文章主要介绍了IDEA实用好用插件推荐及使用方法教程,本文通过实例截图相结合给大家介绍的非常详细,对大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • 使用logback实现按自己的需求打印日志到自定义的文件里

    使用logback实现按自己的需求打印日志到自定义的文件里

    这篇文章主要介绍了使用logback实现按自己的需求打印日志到自定义的文件里,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • java生成随机图片验证码

    java生成随机图片验证码

    这篇文章主要为大家详细介绍了java生成随机图片验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Java 基于tcp协议实现文件上传

    Java 基于tcp协议实现文件上传

    这篇文章主要介绍了Java 基于tcp协议实现文件上传,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-11-11
  • 解决spring中redistemplate不能用通配符keys查出相应Key的问题

    解决spring中redistemplate不能用通配符keys查出相应Key的问题

    这篇文章主要介绍了解决spring中redistemplate不能用通配符keys查出相应Key的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • JAVA实现的简单万年历代码

    JAVA实现的简单万年历代码

    这篇文章主要介绍了JAVA实现的简单万年历代码,涉及Java日期操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10

最新评论