Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot-Elasticsearch

SpringBoot-Elasticsearch

作者头像
是小张啊喂
发布于 2021-08-09 09:41:24
发布于 2021-08-09 09:41:24
96700
代码可运行
举报
文章被收录于专栏:软件软件
运行总次数:0
代码可运行

Spring Boot整合Elasticsearch 废话少说,直接开干

安装

下载一个elasticsearch,这里我们准备的是elasticsearch-6.4.3.tar.gz

上传文件到服务器/usr/local/elasticsearch/elasticsearch-6.4.3

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
解压
$ tar -zxvf elasticsearch-6.4.3.tar.gz
创建用户角色运行
$ useradd root-es
切换用户
$ su root-es
启动 进入到bin目录下
$ ./elasticsearch
请求检查
$ curl 127.0.0.1:9200
{
  "name" : "TZwBB7T",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "7EQkN-jPQyGp672BIG2rbQ",
  "version" : {
    "number" : "6.4.3",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "fe40335",
    "build_date" : "2018-10-30T23:17:19.084789Z",
    "build_snapshot" : false,
    "lucene_version" : "7.4.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

这样显示就是成功了,但是通过ip+port的时候却没有办法访问:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ curl 192.168.1.105:9200
curl: (7) Failed connect to 192.168.1.105:9200; 拒绝连接

这就很难受,最后发现需要修改config中的配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ vim elasticsearch.yml
network.host: 0.0.0.0

重新启动
$ ./elasticsearch

又报错ERROR: bootstrap checks failed

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
编辑/etc/security/limits.conf,追加以下内容;
* soft nofile 65536
* hard nofile 65536 

编辑 /etc/sysctl.conf,追加以下内容:
vm.max_map_count=655360
保存后,执行:
sysctl -p
重新启动,成功。

请求检查
$ curl 192.168.1.105:9200
{
  "name" : "TZwBB7T",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "7EQkN-jPQyGp672BIG2rbQ",
  "version" : {
    "number" : "6.4.3",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "fe40335",
    "build_date" : "2018-10-30T23:17:19.084789Z",
    "build_snapshot" : false,
    "lucene_version" : "7.4.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

Springboot整合elasticsearch

依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plugins {
    id 'org.springframework.boot' version '2.1.11.RELEASE'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

group = 'top.lzmvlog'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '8'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    // 配置镜像仓库
    maven { url 'https://maven.aliyun.com/repository/public/' }
    // 优先本地仓库查找
    mavenLocal()
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

test {
    useJUnitPlatform()
}

对应版本

!!!这里需要注意得是整合得版本问题,elasticsearch-6.4.3我这里整合得是SpringBoot 2.1.11.RELEASE,具体版本对应:

Spring Data Release Train

Spring Data Elasticsearch

Elasticsearch

Spring Boot

2020.0.0[1]

4.1.x[1]

7.9.3

2.3.x[1]

Neumann

4.0.x

7.6.2

2.3.x

Moore

3.2.x

6.8.12

2.2.x

Lovelace

3.1.x

6.2.2

2.1.x

Kay[2]

3.0.x[2]

5.5.0

2.0.x[2]

Ingalls[2]

2.1.x[2]

2.4.0

1.5.x[2]

配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server:
  port: 9099
  data:
    elasticsearch:
      cluster-name: elasticsearch
      # elasticsearch 节点
      cluster-nodes: 127.0.0.1:9300

模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
@Document(indexName = "student", type = "_doc")
public class Student implements Serializable {

    /**
     * id
     */
    private Integer id;

    /**
     * 名称
     */
    private String name;

    /**
     * 年龄
     */
    private Integer age;

}
映射注释
  • @Document:在类级别应用,以指示该类是映射到数据库的候选对象。最重要的属性是:
    • indexName:用于存储此实体的索引的名称。它可以包含SpEL模板表达式,例如 "log-#{T(java.time.LocalDate).now().toString()}"
    • type:映射类型。如果未设置,则使用小写的类的简单名称。(从版本4.0开始不推荐使用)
    • shards:索引的分片数。
    • replicas:索引的副本数。
    • refreshIntervall:索引的刷新间隔。用于索引创建。默认值为*“ 1s”*。
    • indexStoreType:索引的索引存储类型。用于索引创建。默认值为*“ fs”*。
    • createIndex:标记是否在存储库引导中创建索引。默认值为true。请参见使用相应的映射自动创建索引
    • versionType:版本管理的配置。默认值为EXTERNAL
  • @Id:在字段级别应用,以标记用于标识目的的字段。
  • @Transient:默认情况下,存储或检索文档时,所有字段都映射到文档,此注释不包括该字段。
  • @PersistenceConstructor:标记从数据库实例化对象时要使用的给定构造函数,甚至是受保护的程序包。构造函数参数按名称映射到检索到的Document中的键值。
  • @Field:在字段级别应用并定义字段的属性,大多数属性映射到各自的Elasticsearch映射定义(以下列表不完整,请查看注释Javadoc以获得完整参考):
    • name:字段名称,因为它将在Elasticsearch文档中表示,如果未设置,则使用Java字段名称。
    • type:字段类型,可以是以下类型之一:*文本,关键字,长整数,整数,短整数,字节,双精度,浮点型,Half_FloatScaled_Float,日期,Date_Nanos,布尔值,二进制,Integer_RangeFloat_RangeLong_RangeDouble_RangeDate_RangeIp_ ,嵌套,IpTokenCount,过滤器,展平,Search_As_You_Type。请参阅Elasticsearch映射类型
    • format日期类型的pattern定义。必须为日期类型定义。format
    • store:标记原始字段值是否应存储在Elasticsearch中,默认值为false
    • analyzersearchAnalyzernormalizer用于指定自定义分析和正规化。
  • @GeoPoint:将字段标记为geo_point数据类型。如果字段是GeoPoint类的实例,则可以省略。

缓存服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.stereotype.Repository;

@Repository
public interface CacheRepository<S, I extends Number> extendsElasticsearchRepository<Student, Integer>{
}

缓存控制器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
public class CacheController {

    private final CacheRepository<Student, Integer> cacheRepository;

    StudentController(CacheRepository<Student, Integer> cacheRepository) {
        this.cacheRepository = cacheRepository;
    }

    /**
     * 新增缓存
     *
     * @param student
     * @return
     */
    @PostMapping("save")
    public R save(@RequestBody Student student) {
        // 缓存 存放主健一致时 覆盖原因的值 可以用于修改
        cacheRepository.save(student);
        return new R(HttpStatus.OK.value());
    }
    
    /**
     * 根据id查询缓存
     *
     * @return
     */
    @GetMapping("selectById")
    public Optional<Student> selectById(Integer id) {
        return cacheRepository.findById(id);
    }

    /**
     * 查询全部
     *
     * @return
     */
    @GetMapping("select")
    public Iterable<Student> select() {
        return cacheRepository.findAll();
    }
    
    /**
     * 删除全部
     *
     * @return
     */
    @GetMapping("delete")
    public R delete() {
        cacheRepository.deleteAll();
        return new R(HttpStatus.OK.value());
    }

    /**
     * 删除
     *
     * @return
     */
    @GetMapping("deleteById")
    public R deleteById(Integer id) {
        cacheRepository.deleteById(id);
        return new R(HttpStatus.OK.value());
    }
}

查询

关于Elasticsearch的查询,有很多不同的方式,先介绍一些入门的查询方式

按照方法名查询
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
查询
1、从方法名查询创建
 关键字:AND
         OR
         Between
         LessThan 小
         GreaterTha
         Like 模糊
         IgnoreCase
         OrderBy 排序
         Asc 正序
         Desc 倒叙

缓存服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 模糊查询所有学生名称
 *
 * @param name 名称
 * @return
 */
List<Student> findAllByNameLike(String name);

控制器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 根据名称模糊查询
 *
 * @return
 */
@GetMapping("selectAllByName")
public List<Student> selectAllByName(String name) {
    return cacheRepository.findAllByNameLike(name);
}
属性表达式查询
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
若 Student 含有 UserName 字段
例:
List<Student> findByUserName(String userName);
Resulting:
UserName可能会被拆分成 user 、name 两个字段,一定概率!!!
下划线字符视为保留字符,所以我们强烈建议您遵循标准的Java命名约定(即,在属性名称中不使用下划线,而使用驼峰大小写)。
即:List<Student> findBy_UserName(String userName);
特殊参数处理
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    Pageable,Slice和Sort
注:
Pageable 可以用于返回分页信息
Slice 可以用于返回一个集合对象 Slice<Student> 并通过 hasNext() 方法判断是否具有下一个数据 从而进行下一次查询
Sort 排序
Sort sort = Sort.by("id").ascending().and(Sort.by("age").descending());
TypedSort<Student> student = Sort.sort(Student.class);
Sort sort = student.by(Student::getId).ascending().and(student.by(Student::getAge).descending());
TypedSort.by() 通过(通常)使用CGlib使用运行时代理,这在使用Graal VM Native等工具时可能会干扰本机映像编译。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 /**
  * 查询全部
  *
  * @return
  */
@GetMapping("select")
public Iterable<Student> select() {
    // 展示不支持 lambdas 表达式
    // 倒叙查找
    Sort sort = new Sort(Sort.Direction.DESC, "id");
    return cacheRepository.findAll(sort);
}

/**
 * 查询全部
 *
 * @return
 */
@GetMapping("selectPage")
public Page<Student> selectPage(Pageable pageable) {
    return cacheRepository.findAll(pageable);
}

自定义缓存实现

实现在Spring Data Repositories功能之上定义自己的抽象。

中间存储库接口用注释@NoRepositoryBean。确保将注释添加到所有存储库接口,Spring Data不应在运行时为其创建实例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@NoRepositoryBean
public interface CacheRepository<S, I extends Number> extends ElasticsearchRepository<S, I> {

    /**
     * 接口类注解:
     * @NoRepositoryBean
     * 确保将注释添加到所有存储库接口,Spring Data不应在运行时为其创建实例。
     *
     * Resulting:
     * springboot不会为其自动创建 bean
     *
     * Parameter 0 of constructor in top.lzmvlog.elasticsearchdemo.controller.StudentController required a bean of type
     * 'top.lzmvlog.elasticsearchdemo.repository.CacheRepository' that could not be found.
     */

    /**
     * 模糊查询所有学生名称
     *
     * @param name 名称
     * @return
     */
    List<Student> findAllByNameLike(String name);
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Repository
public interface StudentRepository extends CacheRepository<Student, Integer> {

    /**
     * 模糊查询所有学生名称
     *
     * @param name 名称
     * @return
     */
    @Override
    List<Student> findAllByNameLike(String name);
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
public class StudentController {

    private final CacheRepository<Student, Integer> cacheRepository;

    StudentController(CacheRepository<Student, Integer> cacheRepository) {
        this.cacheRepository = cacheRepository;
    }
    
    /**
     * 根据名称模糊查询
     *
     * @return
     */
    @GetMapping("selectAllByName")
    public List<Student> selectAllByName(String name) {
        return cacheRepository.findAllByNameLike(name);
    }
}

Elasticsearch的查询和Sping data Jpa基本上差不多,要是一起用怕是会蒙圈。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
springboot与elasticsearch
最近看了下elasticsearch相关的知识,对其使用有了个大概的了解,于是准备试着与springboot整合看下,在网上搜索了很多文章,但是真的按着坐下来发现成功的没几个,最后发现主要的问题还是出在版本上,由于现在es版本和springboot版本都有很多,但是很多人都只写了示例,而没有介绍自己的测试环境,那么其他人也就只能借鉴下,而去其他意义。
sucl
2019/08/07
9610
SpringBoot整合elasticsearch
在这一篇文章开始之前,你需要先安装一个ElasticSearch,如果你是mac或者linux可以参考https://www.jianshu.com/p/e47b451375ea,如果是windows可以自定百度一下。 下面是官方套话介绍elasticsearch: ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业
dalaoyang
2018/06/13
8610
Spring Boot + Elasticsearch 实现索引的日常维护
全文检索的应用越来越广泛,几乎成了互联网应用的标配,商品搜索、日志分析、历史数据归档等等,各种场景都会涉及到大批量的数据,在全文检索方面,方案无外乎Lucene、Solr、Elasticsearch三种应用的较为广泛。es、solr的底层都依托于Lucene,但es比solr学习成本更低,由于其提供的RESTful API简单快捷,对互联网应用开发而言更是如虎添翼。
MavenTalker
2023/03/08
1K0
Spring Boot + Elasticsearch 实现索引的日常维护
ElasticSearch学习笔记(5)——SpringBoot整合ElasticSearch
本节主要介绍SpringBoot与ElasticSearch的整合,并实现简单的CRUD。
张申傲
2020/09/03
1.6K0
基于SpringBoot、Elasticsearch实现酒店查询功能!
在一些应用中,Elasticsearch应用于全文搜索的很少,多是用于ToC端的查询,更像是一个缓存数据库。
Java程序猿
2021/02/19
9790
😊SpringBoot 整合 Elasticsearch (超详细).md
用户7630333
2023/12/07
2.8K0
😊SpringBoot 整合 Elasticsearch (超详细).md
使用ElasticSearch完成百万级数据查询附近的人功能
上一篇文章介绍了ElasticSearch使用Repository和ElasticSearchTemplate完成构建复杂查询条件,简单介绍了ElasticSearch使用地理位置的功能。
天涯泪小武
2019/01/17
1.4K0
【SpringBoot2.0系列11】SpringBoot之@Elasticsearch完成CURD
【SpringBoot系列02】SpringBoot之使用Thymeleaf视图模板
yukong
2018/10/09
2.2K0
【SpringBoot2.0系列11】SpringBoot之@Elasticsearch完成CURD
Springboot前后端分离开发
.1.springboot前后端分离开发之前要配置好很多东西,这周会详细补充博客内容和遇到的问题的解析
阮键
2019/08/07
1.1K0
Spring全家桶之SpringData——SpringDataElasticSearch
使用 Spring Data 下二级子项目 Spring Data Elasticsearch 进行操作。 支持 POJO 方 法操作 Elasticsearch。相比 Elasticsearch 提供的 API 更加简单更加方便。
时间静止不是简史
2021/03/04
1.7K0
SpringDataElasticsearch操作Elasticsearch创建索引库以及创建映射
注意:SpringDataElasticsearch底层使用的不是Elasticsearch提供的RestHighLevelClient,而是TransportClient,并不采用Http协议通信,而是访问elasticsearch对外开放的tcp端口
用户9006224
2022/12/21
8860
SpringBoot 使用JestClient操作Elasticsearch
操作Elasticsearch的客户端有很多,SpringBoot也提供了方式去操作,这里介绍另外一种方式去使用Elasticsearch --- JestClient
dalaoyang
2020/05/17
1.2K0
Elasticsearch学习(六)手把手教你用Java操作Elaticsearch, 教你学会ElasticsearchTemplate的使用
使用Spring Data 下二级子项目Spring Data Elasticsearch进行操作。支持POJO方法操作Elasticsearch。相比Elasticsearch提供的API更加简单更加方便。
一写代码就开心
2021/03/02
1.9K0
Elasticsearch学习(六)手把手教你用Java操作Elaticsearch, 教你学会ElasticsearchTemplate的使用
SpringDataJPA笔记(3)-基于SpringBoot基础用法
基于SpringBoot的基础用法 STEP1. 引入POM依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> 这里有一个使用Specification查询时很好用的工具包,感谢做工具包的同学 <!-- https://mvnrepository.com/artifact/com.gith
yingzi_code
2019/08/31
5320
springboot 整合 ElasticSearch
ElasticSearch是目前全文搜索引擎的首选,可以快速的存储、搜索和分析数据,并且ES是一个分布式搜索服务,提供Restful API,底层基于Lucene,采用多shard(分片)的方式保证数据安全,并且提供自动resharding的功能,github等大型的站点也是采用了ES作为其搜索服务
桑鱼
2020/03/17
1.2K0
聊聊springboot elasticsearch autoconfigure
本文主要研究一下springboot elasticsearch autoconfigure
code4it
2019/04/17
1.7K0
聊聊springboot elasticsearch autoconfigure
Lucene 和 Kibana、ElasticSeach、Spring Data ElasticSearch
结构化数据 - 行数据,可以用二维表结构来逻辑表达实现的数据;指具有固定格式或有限长度的数据,如数据库,元数据等。
RendaZhang
2020/12/02
2.3K0
springboot 2.2.x +ES 7.4.x 实现分词和高亮搜索
application.properties es默认没有密码,暂时未设定用户密码
smallmayi
2022/05/12
8400
springboot 2.2.x +ES 7.4.x 实现分词和高亮搜索
SpringBoot连接Elasticsearch实战总结
第一次使用elasticsearch,于是从网上找轮子复制粘贴。早好轮子测试完毕,上线。可是几天下来发现接口响应时间一直都偏高(默认的超时时间是500ms),所以就不停的对代码优化,缩短时间。但是到最后代码已经不能再优化了,响应时间依然没有明显的下降趋势,甚至在高峰期会严重超时。接下来会慢慢讲解elasticsearch使用优化。
小森啦啦啦
2019/07/13
4K0
重学SpringBoot3-整合 Elasticsearch 8.x (二)使用Repository
上一篇文章介绍了 Spring Boot 3 整合 Elasticsearch 8.x 的几种客户端形式,除此之外,Spring Data 对 Elasticsearch 还提供了 Repository 支持,与前面讨论的JPA Repository 一样,其基本原理是根据方法名称自动为你构建查询,提供了更简便的数据搜索和分析功能。本文将介绍如何使用 Spring Data Elasticsearch Repository 来构建一个简单的搜索应用。
CoderJia
2024/11/05
1.1K0
重学SpringBoot3-整合 Elasticsearch 8.x (二)使用Repository
相关推荐
springboot与elasticsearch
更多 >
加入讨论
的问答专区 >
1技术总监架构部总经理擅长3个领域
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
    本文部分代码块支持一键运行,欢迎体验
    本文部分代码块支持一键运行,欢迎体验