😊SpringBoot 整合 Elasticsearch (超详细).md
SpringBoot 整合 Elasticsearch (超详细)
注意:
1、环境搭建
安装es
为了方便,环境使用Windows
配置
解压后配置
- 找到config目录的
elasticsearch.yml 
分词器
默认的Es是不支持中文分词的,下载
ik分词器(下载的版本要与Es保持一致)
下图所示,解压后的分词器放在
plugins目录下,ik目录需要自己创建

启动
- 由于我是在
Windows环境下,找到bin目录的elasticsearch.bat双击即可。
命令测试
- 查看健康状态
- curl -X GET “localhost:9200/_cat/health?v“
- 查看所有节点
- curl -X GET “localhost:9200/_cat/nodes?v“
- 新建索引
- curl -X PUT "localhost:9200/test"
- ️ 查看索引
- curl -X GET "localhost:9200/_cat/indices?v"
- 删除索引
- curl -X DELETE "localhost:9200/test"
2、整合 Es
依赖 & 配置
- 我这里使用的是
SpringBoot 2.1.5.RELEASE,根据实际情况选择版本。
<!--elasticsearch-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
yaml配置

properties配置
spring.data.elasticsearch.cluster-name=community
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
启动项目:
- 不出意外肯定会出意外

- 这个问题是由于Es底层的问题,这里就不展开解释,会提供思路,自行了解
解决办法:

3、使用
SpringBoot 整合 Elasticsearch视频教程
实体类
- 相信之前学过Jpa的同学,对于以下配置很熟悉。
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;
// 指定Es 索引 类型 分片 备份
@Document(indexName = "discusspost", type = "_doc", shards = 6, replicas = 3)
@Data
public class DiscussPost implements Serializable {
private static final long serialVersionUID = 114809849189593294L;
// 标识主键
@Id
private Integer id;
// 对应文档类型
@Field(type = FieldType.Integer)
private Integer userId;
/**
* type 类型
* analyzer 存储解析器
* searchAnalyzer 查询解析器
*/
@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
private String title;
@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
private String content;
}
持久层
ElasticsearchRepository里面有许多常用方法
@Repository
public interface DiscussPostRepository extends ElasticsearchRepository<DiscussPost, Integer> {
}
测试代码
- 查询数据层的代码就不展示了,我会在代码中说明
- 时间足够,建议把视频看完
/**
* @author : look-word
* 2022-11-03 18:56
**/
@SpringBootTest
@RunWith(SpringRunner.class)
public class ElasticSearchTest {
@Resource
private DiscussPostRepository discussPostRepository;
@Resource
private DiscussPostMapper discussPostMapper;
@Resource
private ElasticsearchTemplate elasticsearchTemplate;
@Test
public void testInsert() {
// 将查询的结果,同步到Es中
discussPostRepository.save(discussPostMapper.selectDiscussPostById(241));
}
@Test
public void testInsertAll() {
// 批量导入 discussPostRepository.saveAll()
discussPostRepository.saveAll(discussPostMapper.selectDiscussPosts(101, 0, 100));
}
/**
* 测试更新
*/
@Test
public void testUpdate() {
DiscussPost discussPost = discussPostMapper.selectDiscussPostById(241);
discussPost.setContent("我爱中华人民共和国,我是中国人");
discussPostRepository.save(discussPost);
}
/**
* 测试修改
*/
@Test
public void testDelete() {
discussPostRepository.deleteById(241);
}
/**
* 测试查询
*/
@Test
public void testSelect() {
// 构造查询条件
SearchQuery searchQuery = new NativeSearchQueryBuilder()
// (查询的值,查询字段1,查询字段1) 匹配title或者title里面是否含有互联网寒冬
.withQuery(QueryBuilders.multiMatchQuery("互联网寒冬", "title", "title"))
.withSort(SortBuilders.fieldSort("type").order(SortOrder.DESC)) // 排序
.withSort(SortBuilders.fieldSort("score").order(SortOrder.DESC))
.withSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC))
.withPageable(PageRequest.of(0, 10)) // 分页
.withHighlightFields(
new HighlightBuilder.Field("title").preTags("<em>").postTags("</em>"),
new HighlightBuilder.Field("content").preTags("<em>").postTags("</em>")
).build(); //高亮
Page<DiscussPost> page = discussPostRepository.search(searchQuery);
page.get().forEach(System.out::println);
}
/**
* 测试查询高亮显示
*/
@Test
public void testSelectHighlight() {
// 构造查询条件
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.multiMatchQuery("互联网寒冬", "title", "content"))
.withSort(SortBuilders.fieldSort("type").order(SortOrder.DESC)) // 排序
.withSort(SortBuilders.fieldSort("score").order(SortOrder.DESC))
.withSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC))
.withPageable(PageRequest.of(0, 10)) // 分页
.withHighlightFields(
new HighlightBuilder.Field("title").preTags("<em>").postTags("</em>"),
new HighlightBuilder.Field("content").preTags("<em>").postTags("</em>")
).build(); //高亮
Page<DiscussPost> page = elasticsearchTemplate.queryForPage(searchQuery, DiscussPost.class, new SearchResultMapper() {
@Override
public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> aClass, Pageable pageable) {
SearchHits hits = response.getHits();
if (hits.getTotalHits() <= 0) {
return null;
}
List<DiscussPost> list = new ArrayList<>();
for (SearchHit hit : hits) {
DiscussPost post = new DiscussPost();
String id = hit.getSourceAsMap().get("id").toString();
post.setId(Integer.parseInt(id));
String userId = hit.getSourceAsMap().get("userId").toString();
post.setUserId(Integer.parseInt(userId));
String title = hit.getSourceAsMap().get("title").toString();
post.setTitle(title);
String content = hit.getSourceAsMap().get("content").toString();
post.setContent(content);
String type = hit.getSourceAsMap().get("type").toString();
post.setType(Integer.parseInt(type));
String status = hit.getSourceAsMap().get("status").toString();
post.setStatus(Integer.parseInt(status));
String createTime = hit.getSourceAsMap().get("createTime").toString();
post.setCreateTime(new Date(Long.parseLong(createTime)));
String commentCount = hit.getSourceAsMap().get("commentCount").toString();
post.setCommentCount(Integer.parseInt(commentCount));
String score = hit.getSourceAsMap().get("score").toString();
post.setScore(Double.parseDouble(score));
// 处理高亮
HighlightField titleField = hit.getHighlightFields().get("title");
// 页面有多个高亮字 只显示第一个
if (titleField != null) {
post.setTitle(titleField.getFragments()[0].toString());
}
HighlightField contentField = hit.getHighlightFields().get("content");
if (contentField != null) {
post.setTitle(contentField.getFragments()[0].toString());
}
list.add(post);
}
return new AggregatedPageImpl(list, pageable, hits.getTotalHits(), response.getAggregations(), response.getScrollId(), hits.getMaxScore());
}
});
page.get().forEach(System.out::println);
}
}
😊SpringBoot 整合 Elasticsearch (超详细).md的更多相关文章
- SpringBoot整合Elasticsearch详细步骤以及代码示例(附源码)
准备工作 环境准备 JAVA版本 java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121 ...
- springboot整合elasticsearch入门例子
springboot整合elasticsearch入门例子 https://blog.csdn.net/tianyaleixiaowu/article/details/72833940 Elastic ...
- SpringBoot整合ElasticSearch实现多版本的兼容
前言 在上一篇学习SpringBoot中,整合了Mybatis.Druid和PageHelper并实现了多数据源的操作.本篇主要是介绍和使用目前最火的搜索引擎ElastiSearch,并和Spring ...
- ElasticSearch(2)---SpringBoot整合ElasticSearch
SpringBoot整合ElasticSearch 一.基于spring-boot-starter-data-elasticsearch整合 开发环境:springboot版本:2.0.1,elast ...
- SpringBoot整合Mybatis完整详细版二:注册、登录、拦截器配置
接着上个章节来,上章节搭建好框架,并且测试也在页面取到数据.接下来实现web端,实现前后端交互,在前台进行注册登录以及后端拦截器配置.实现简单的未登录拦截跳转到登录页面 上一节传送门:SpringBo ...
- SpringBoot整合Mybatis完整详细版
记得刚接触SpringBoot时,大吃一惊,世界上居然还有这么省事的框架,立马感叹:SpringBoot是世界上最好的框架.哈哈! 当初跟着教程练习搭建了一个框架,传送门:spring boot + ...
- Springboot整合elasticsearch以及接口开发
Springboot整合elasticsearch以及接口开发 搭建elasticsearch集群 搭建过程略(我这里用的是elasticsearch5.5.2版本) 写入测试数据 新建索引book( ...
- Springboot整合Elasticsearch报错availableProcessors is already set to [4], rejecting [4]
Springboot整合Elasticsearch报错 今天使用SpringBoot整合Elasticsearch时候,相关的配置完成后,启动项目就报错了. nested exception is j ...
- Springboot整合ElasticSearch进行简单的测试及用Kibana进行查看
一.前言 搜索引擎还是在电商项目.百度.还有技术博客中广泛应用,使用最多的还是ElasticSearch,Solr在大数据量下检索性能不如ElasticSearch.今天和大家一起搭建一下,小编是看完 ...
随机推荐
- 做自动化测试选择Python还是Java?
你好,我是测试蔡坨坨. 今天,我们来聊一聊测试人员想要进阶,想要做自动化测试,甚至测试开发,如何选择编程语言. 前言 自动化测试,这几年行业内的热词,也是测试人员进阶的必备技能,更是软件测试未来发展的 ...
- Helm安装ingress-nginx-4.2.3
Application version 1.3.0 Chart version 4.2.3 获取chart包 helm fetch ingress-nginx/ingress-nginx --vers ...
- 快Key:按一下鼠标【滚轮】,帮你自动填写用户名密码,快速登录,可制作U盘随身(开源免费-附安装文件和源代码)
* 代码以本文所附下载文件包为准,安装文件和源文件包均在本文尾部可下载. * 快Key及本文所有内容仅供交流使用,使用者责任自负,由快Key对使用者及其相关人员或组织造成的任何损失均由使用者自负,与本 ...
- 重新扫描磁盘.bat
工作需要,需要常常扫描磁盘, 以前是先调用磁盘管理器,然后使用alt+a,再按r,完成对磁盘的扫描 但是速度慢效率低 昨天帮朋友装台式电脑系统的时候,他说要给磁盘分区, 发现磁盘内有卷被占用,无法删除 ...
- 内存溢出(OOM)分析
当JVM内存不足时,会抛出java.lang.OutOfMemoryError. 主要的OOM类型右: Java heap space:堆空间不足 GC overhead limit exceed ...
- Django 聚合查询 分组查询 F与Q查询
一.聚合查询 需要导入模块:from django.db.models import Max, Min, Sum, Count, Avg 关键语法:aggregate(聚合结果别名 = 聚合函数(参数 ...
- 彻底掌握Makefile(二)
彻底掌握Makefile(二) 前言 在前面的文章彻底掌握Makefile(一)当中,我们简要的介绍了一些常见的makefile使用方法,在本篇文章当中我们将继续介绍一些makefile当中的常见用法 ...
- harbor官方关于创建https的有关命令
官方地址:https://goharbor.io/docs/2.0.0/install-config/configure-https/ 命令总结: openssl genrsa -out ca.key ...
- Kubernetes 配置管理
ConfigMap(可变配置管理) 对于应用的可变配置在 Kubernetes 中是通过一个 ConfigMap 资源对象来实现的,我们知道许多应用经常会有从配置文件.命令行参数或者环境变量中读取一些 ...
- Elasticsearch与MySQL对应关系表
MySQL 中的数据库(DataBase),等价于 ES 中的索引(Index). MySQL 中一个数据库下面有 N 张表(Table),等价于1个索引 Index 下面有 N 多类型(Type). ...