Springboot集成Elasticsearch

在springboot中集成Elasticsearch,以我开发的博客系统项目为例,这是一篇文章内容。
准备
本次Elasticsearch使用的是单机版,版本为6.7.8,并且装好中文分词器。

Springboot集成Elasticsearch

  1. 首先在pom文件中引入Elasticsearch依赖。
 <!--elasticsearch--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>
  1. 创建一个对象,与数据库存储结构字段对应,使用@Data是导入了lombok,
    @Document(indexName = “article_document”, type = “docs”, shards = 1, replicas = 0),这个注解会在elasticsearch里面创建一个article_document的索引。@Id 注解为elasticsearch的id字段。

类型(type)
每个文档都有与之对应的类型(type)定义。这允许用户在一个索引中存储多种文档类型,并为不同文档提供类型提供不同的映射。
分片(shards)#
代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。5.X默认不能通过配置文件定义分片
副本(replicas)#
代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当个某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。

@Data
@Document(indexName = "article_document", type = "docs", shards = 1, replicas = 0)
public class ArticleDocument implements Serializable {@Idprivate Long id;@Field(type = FieldType.Text, analyzer = "ik_max_word")private String title; //标题@Field(type = FieldType.Text, analyzer = "ik_max_word")private String summary;// 概述@Field(type = FieldType.Text, analyzer = "ik_max_word")private String content; // 内容@Field(type = FieldType.Boolean)private Boolean published;//是否已发布@Field(type = FieldType.Integer)private Integer status;//审核状态public interface Table {String ID = "id";String TITLE = "title";String SUMMARY = "summary";String CONTENT = "content";String PUBLISHED = "published";String STATUS = "status";}
}
  1. 写一个接口ArticleDocumentRepository继承ElasticsearchRepository,ElasticsearchRepository包含了基本的增删改查的能力,并在接口类上加上@Repository注解,注入到spring 容器中.
@Repository
public interface ArticleDocumentRepository extends ElasticsearchCrudRepository<ArticleDocument, Long> {List<ArticleDocument> findDistinctByTitleLikeOrSummaryLikeOrContentLike(String title, String summary, String content);
}
  1. ArticleDocumentServiceImpl类自动注入ArticleDocumentRepository的接口,去操作Elasticsearch。
 @Autowiredprivate ArticleDocumentRepository articleDocumentRepository;
  1. 接着就对Elasticsearch进行增删改查的操作。
    保存

我是用了mybatis-plus,可以根据自己修改,在保存文章的时候,调用这个方法,Article是我的文章对象。

public void saveToElasticSearch(Article article) {ArticleDocument articleDocument = new ArticleDocument();BeanUtils.copyProperties(article, articleDocument);if (articleDocument.getPublished() == null) {QueryWrapper<Article> wrapper = new QueryWrapper<>();wrapper.select(Article.Table.PUBLISHED).eq(Article.Table.ID, article.getId());Article temp = articleMapper.selectOne(wrapper);articleDocument.setPublished(temp.getPublished());}if (articleDocument.getStatus() == null) {QueryWrapper<Article> wrapper = new QueryWrapper<>();wrapper.select(Article.Table.STATUS).eq(Article.Table.ID, article.getId());Article temp = articleMapper.selectOne(wrapper);articleDocument.setStatus(temp.getStatus());}articleDocumentRepository.save(articleDocument);}

更新
先将原来的索引删除掉

 //从ElasticSearch中删除articleDocumentRepository.deleteById(article.getId());

再保存新的索引

 saveToElasticSearch(article);

删除

 articleDocumentRepository.deleteById(article.getId());

查询
将查询的结果用List返回。

public List<ArticleDocument> listByKeyword(String keyword) throws IOException {SearchRequest searchRequest = new SearchRequest(TableConstant.ARTICLE_DOCUMENT);//匹配查询SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keyword, ArticleDocument.Table.TITLE, ArticleDocument.Table.SUMMARY, ArticleDocument.Table.CONTENT);TermQueryBuilder termQueryBuilder1 = QueryBuilders.termQuery(ArticleDocument.Table.PUBLISHED, true);TermQueryBuilder termQueryBuilder2 = QueryBuilders.termQuery(ArticleDocument.Table.STATUS, Constant.AUDIT_PASS);BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().must(multiMatchQueryBuilder).must(termQueryBuilder1).must(termQueryBuilder2);sourceBuilder.query(boolQueryBuilder);//高亮HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.field(ArticleDocument.Table.TITLE).field(ArticleDocument.Table.SUMMARY).field(ArticleDocument.Table.CONTENT);highlightBuilder.preTags(Constant.HIGH_LIGHT_PRE_TAGS);highlightBuilder.postTags(Constant.HIGH_LIGHT_POST_TAGS);sourceBuilder.highlighter(highlightBuilder);//执行搜索searchRequest.source(sourceBuilder);SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);//解析结果List<ArticleDocument> articleDocuments = new ArrayList<>();for (SearchHit hit : searchResponse.getHits().getHits()) {Map<String, Object> map = hit.getSourceAsMap();//原来的结果//解析高亮的字段HighLightUtil.parseField(hit, ArticleDocument.Table.TITLE);HighLightUtil.parseField(hit, ArticleDocument.Table.SUMMARY);HighLightUtil.parseField(hit, ArticleDocument.Table.CONTENT);ArticleDocument articleDocument = new ArticleDocument();articleDocument.setId(Long.valueOf((Integer) map.get(ArticleDocument.Table.ID)));articleDocument.setTitle((String) map.get(ArticleDocument.Table.TITLE));articleDocument.setSummary((String) map.get(ArticleDocument.Table.SUMMARY));articleDocument.setContent((String) map.get(ArticleDocument.Table.CONTENT));articleDocuments.add(articleDocument);}return articleDocuments;}

elasticsearch有一个高亮配置HighLightUtil,可以使关键词高亮显示。

import org.elasticsearch.common.text.Text;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;import java.util.Map;public class HighLightUtil {public static void parseField(SearchHit hit, String field) {Map<String, Object> map = hit.getSourceAsMap();//原来的结果HighlightField title = hit.getHighlightFields().get(field);//解析高亮的字段if (title != null) {Text[] fragments = title.fragments();StringBuilder newTitle = new StringBuilder();for (Text fragment : fragments) {newTitle.append(fragment);}//高亮文本替换掉原来的内容map.put(field, newTitle.toString());}}

我们可以看到,这里我使用的是谷歌商城的ElasticSearch Heap这个插件,非常方便。
在这里插入图片描述
有什么问题可以再评论区评论,我会尽快回复。

参考文章:https://blog.csdn.net/forezp/article/details/106839262

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 替代品

我推荐替代产品&#xff1a;AlmaLinux 免费&#xff0c;和centos相似度都比较高&#xff0c;社区活跃度高 官网&#xff1a;https://almalinux.org/

卡顿人生,如何拯救?

原文链接&#xff1a;https://yqh.aliyun.com/detail/17536?utm_contentg_1000161682 本文为阿里云原创内容&#xff0c;未经允许不得转载。

三个月前被 K8S 弃用,Docker 火了!获 2300 万美元融资

整理 | 寇雪芹头图 | 下载于视觉中国出品 | CSDN云计算&#xff08;ID:CSDNcloud)美国加州时间 3月16号&#xff0c;Docker 宣布获得 2300 万美元的 B 轮融资。经过此轮融资&#xff0c;Docker的总资金达到5800万美元&#xff0c;主导本轮投资的是硅谷风投公司 Tribe Capital&a…

阿里腾讯今日头条纷纷翻牌子,ClickHouse到底有什么本事?

ClickHouse是近年来备受关注的开源列式数据库&#xff0c;主要用于数据分析&#xff08;OLAP&#xff09;领域。目前国内社区火热&#xff0c;各个大厂纷纷跟进大规模使用&#xff1a; 今日头条 内部用ClickHouse来做用户行为分析&#xff0c;内部一共几千个ClickHouse节点&am…

开启VScode的nvue、vue文件类型支持 - 代码高亮

装Vetur创建&#xff0c;配置&#xff0c;ok 注意&#xff1a;后面的值都是vue 效果图

Dubbo-go 发布 1.5 版,朝云原生迈出关键一步

引语 计算机技术浪潮每 10 年都有一次技术颠覆&#xff0c;相关知识体系最迟每 5 年都会革新一次&#xff0c;大概每两年贬值一半&#xff0c;在应用服务通信框架领域亦然。凡是有长期生命的通信框架&#xff0c;大概有 5 年的成长期和 5 年的稳定成熟期。每个时代都有其匹配的…

互联网究竟是怎么诞生的?

作者 | 小枣君来源 | 鲜枣课堂&#xff08;ID&#xff1a;xzclasscom&#xff09;1957年10月4日&#xff0c;苏联发射了人类第一颗人造卫星——斯普特尼克一号。斯普特尼克一号&#xff08;Спутник-1&#xff09;这颗卫星的升空&#xff0c;轰动了整个世界&#xff0c;也…

引入阿里云GA,商米加速IoT产品和解决方案全球化布局

在全球化战略布局下&#xff0c;今年以来&#xff0c;商米联合全球合作伙伴推出了多款智能IoT 产品和数字化解决方案&#xff0c;为商户提供更专业地服务。同时&#xff0c;今年6月份&#xff0c;商米还引入阿里全球加速GA&#xff0c;加速实现信息化办公系统全球部署&#xff…

企业方案 vscode

文章目录1. 下载插件2. 配置1. 下载插件 2. 配置 {"mithrilEmmet.vnodeFactoryFunctionName": "m", // Specifies the name of vnode factory function. E.g. for mithril, use m; for hyperscript, use h."mithrilEmmet.outputDefaultTagName"…

问答题:如何构建一套满足GPT-3的存储系统?

这几天GPT-3成为人工智能甚至整个科技圈最为热门的话题。作为著名人工智能科研公司 OpenAI 开发的文字生成 (text generation) 人工智能&#xff0c;GPT-3的相关论文在2020年5月份就已经发表&#xff0c;由于使用了45TB的数据&#xff0c;并采用了天文数字级别的1,750亿参数量而…

抖音实战~手机号一键注册登录流程(验证码)

文章目录一、 一键注册登录流程二、前端2.1. 验证码获取流程2.2. 验证码获取代码三、后端验证码3.1. 前置处理3.2. 拦截器添加3.3. 获取验证码一、 一键注册登录流程 二、前端 2.1. 验证码获取流程 1.点击->获取验证码调用后端获取验证码api接口2.验证码59秒倒计时3.重复点…

《2021中国数据资产化工具市场研究报告》隆重发布

早在五年前&#xff0c;数据是21世纪“新石油”的口号就已响彻行业。 在2020年4月&#xff0c;我国首次将“数据”与土地、劳动力、资本、技术并列为五大生产要素&#xff0c;并提出要“加快培育数据要素市场&#xff0c;完善数据要素的市场化配置机制”。企业作为市场主体&am…

秒懂云通信:如何用阿里云语音通知服务(小白指南)

简介&#xff1a; 手把手教你如何使用阿里云语音通知服务&#xff0c;超详细控制台步骤解析&#xff0c;快速上手&#xff01;更有1650元短信体验代金券和免费试用&#xff0c;点击速抢&#xff1a;https://yqh.aliyun.com/live/cloudcommunication-videos 一、如何开通阿里云…

Mysql如何统计表的大小

在开发中遇到一个问题&#xff0c;我要统计哪个表中的数据增长度快。于是就想要找出每个表的大小。 SELECT CONCAT(table_schema,.,table_name) AS Table Name, CONCAT(ROUND(table_rows/1000000,4),M) AS Number of Rows, CONCAT(ROUND(data_length/(1024*1024),4),M) AS Dat…

抖音实战~个人中心模块

文章目录一、个人中心主页1. 主页元素2. 表设计3. 计数方案评估二、用户信息查询~接口设计2.1. 用户信息查询流程图2.2. 用户信息查询流程三、用户信息更新~接口设计3.1. 流程图3.2. 流程简述四、用户背景图用户头像~接口设计4.1. 更新/上传图片流程图4.2. 更新/上传~流程简述五…

分布式系统架构与云原生—阿里云《云原生架构白皮书》导读

简介&#xff1a; 有幸作为阿里云MVP提前获得了阿里云云原生团队编写的《云原生架构白皮书》&#xff0c;希望通过自己对于云原生的理解为开发者提供一篇观后感或者是能够参考的博文 1 云原生与分布式系统架构的关系 1.1 云原生架构的定义 《云原生架构白皮书》中对于云原生…

纵行科技携手意法半导体推ZETA/LoRa双模智能路由,加速LPWAN 2.0泛在物联布局!

物联网在接入各行业的过程中使用了各种各样的行业标准和协议&#xff0c;联盟的形式可以加速聚拢物联网产业链生态&#xff0c;促进物联网应用更好更快地落地&#xff0c;因此成为物联网领域内厂商们欢迎的合作共赢方式。 ZETA就是众多物联网联盟中的一个&#xff0c;这是由基于…

阿里云飞天AI加速器+Serverless容器,帮助图森未来提升资源利用率

简介&#xff1a; 今年年初&#xff0c;图森未来的无人驾驶卡车还上了“钢铁侠”的扮演者小罗伯特唐尼主持的科技聚集剧集《The Age of A.I.》&#xff08;《AI时代》&#xff09;&#xff0c;在剧中不仅顺利完成无人驾驶的行驶任务&#xff0c;还与围追堵截的摄像车“斗智斗勇…

应用中心最佳实践之——使用应用组完成多集群一键部署

简介&#xff1a; 在现实中的应用交付实践中&#xff0c;常常需要将同一应用同时部署到多个集群中。应用中心支持将同一个数据源定义的应用&#xff0c;通过应用组的形式一键部署到多个集群中&#xff0c;实现统一管理。 作者&#xff1a;指北 背景 在现实中的应用交付实践中…

vue cil安装axios

Vue cil 安装axios1、安装axioscnpm install axios 如果没有安装cnpm的可能安装不成功&#xff0c;这里列出安装cnpm&#xff0c;使用淘宝镜像。 npm install -g cnpm --registryhttps://registry.npm.taobao.org2、使用方法 2.1、首先在main.js配 import axios from "…