SpringBoot2.x系列教程54--NoSQL之整合
SpringBoot2.x系列教程54--NoSQL之SpringBoot整合ElasticSearch方式一
作者:一一哥
(资料图片仅供参考)
一. Elastic Search
1. Elastic Search简介
ElasticSearch是一个基于Lucene的开源的、分布式实时搜索和分析引擎。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。
Spring Boot为Elasticsearch提供基本的自动配置,我们可以利用Spring Data Elasticsearch在Spring Boot中进行开发。
2. 搭建配置Elastic Search环境
在利用Elastic Search开发之前,请先搭建好Elastic Search环境,我这里配置了ELK环境。关于ELK环境的搭建,感兴趣的朋友可以自行搜索。
3. Spring Boot与Elastic Search版本关系
在新版本的Spring boot2.x中,spring-boot-starter-data-elasticsearch支持的Elasticsearch版本是2.X,但Elasticsearch实际上已经发展到6.5.X版本了,为了更好的使用Elasticsearch的新特性,我们可以弃用spring-boot-starter-data-elasticsearch依赖,改为直接使用Spring-data-elasticsearch,以便启用对新版本支持,目前的版本对应关系如下:
二. Spring Boot2.2.5整合Elastic Search 5.6.8
1. 环境要求
Spring Boot 2.2.5;Elastic Search 5.6.8;Kibana 5.6.8;Maven
2. 创建web项目
我们按照之前的经验,创建一个web程序,并将之改造成Spring Boot项目,具体过程略。
3. 添加依赖包
org.springframework.bootspring-boot-starter-data-elasticsearch
注意:因为我的elastic search 并不是6.5.x以上的最新版本,而是5.6.8版本,所以我这里使用的还是spring-boot-starter-data-elasticsearch的依赖包。
4. 创建application.yml配置文件
# Elasticsearch# 9200作为Http协议,主要用于外部通讯,而9300作为Tcp协议,是传输层监听的默认端口,jar之间就是通过tcp协议通讯elasticsearch: #注意cluster.name需要与config/elasticsearch.yml中的cluster.name一致 # Elasticsearch cluster name. cluster: name: elasticsearch # Comma-separated list of cluster node addresses. ip: localhost port: 9300 pool: 5
elastic search默认的端口号是9300。
5. 创建ElasticSearchConfig配置类
package com.yyg.boot.config;import lombok.extern.slf4j.Slf4j;import org.elasticsearch.client.Client;import org.elasticsearch.client.transport.TransportClient;import org.elasticsearch.common.settings.Settings;import org.elasticsearch.common.transport.TransportAddress;import org.elasticsearch.transport.client.PreBuiltTransportClient;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.elasticsearch.core.ElasticsearchOperations;import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;import java.net.InetAddress;/** * @Author 一一哥Sun * @Date Created in 2020/4/13 * @Description Description */@Slf4j@Configurationpublic class ElasticSearchConfig { @Value("${elasticsearch.ip}") private String hostName; @Value("${elasticsearch.port}") private String port; @Value("${elasticsearch.cluster.name}") private String clusterName; @Value("${elasticsearch.pool}") private String poolSize; /** * 构建TransportClient对象 */ @Bean(name = "transportClient") public TransportClient transportClient() { log.info("Elasticsearch初始化开始。。。。。"); TransportClient transportClient = null; try { // 配置信息 Settings esSetting = Settings.builder() //集群名字 .put("cluster.name", clusterName) //增加嗅探机制,找到ES集群 .put("client.transport.sniff", true) //增加线程池个数,暂时设为5 .put("thread_pool.search.size", Integer.parseInt(poolSize)) .build(); //配置信息Settings自定义 transportClient = new PreBuiltTransportClient(esSetting); TransportAddress transportAddress = new TransportAddress(InetAddress.getByName(hostName), Integer.valueOf(port)); transportClient.addTransportAddresses(transportAddress); } catch (Exception e) { log.error("elasticsearch TransportClient create error!!", e); } return transportClient; } /** * 构建ElasticsearchTemplate对象 */ @Bean public ElasticsearchOperations elasticsearchTemplate() { Client client = transportClient(); if (client != null) { return new ElasticsearchTemplate(client); } else { //弹出异常对象 throw new RuntimeException("初始化Elasticsearch失败!"); } }}
6. 创建增删改查接口
我这里直接使用TransportClient进行增删改查,后面的章节中,我会讲解简化方案。
package com.yyg.boot.web;import org.elasticsearch.action.get.GetResponse;import org.elasticsearch.action.index.IndexResponse;import org.elasticsearch.action.search.SearchRequestBuilder;import org.elasticsearch.action.search.SearchResponse;import org.elasticsearch.action.search.SearchType;import org.elasticsearch.client.transport.TransportClient;import org.elasticsearch.common.xcontent.XContentBuilder;import org.elasticsearch.common.xcontent.XContentFactory;import org.elasticsearch.index.query.BoolQueryBuilder;import org.elasticsearch.index.query.QueryBuilders;import org.elasticsearch.index.query.RangeQueryBuilder;import org.elasticsearch.search.SearchHit;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.format.annotation.DateTimeFormat;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.*;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.Map;/** * @Author 一一哥Sun * @Date Created in 2020/4/13 * @Description Description */@RestController@RequestMapping("/book")public class BookController { @Autowired private TransportClient transportClient; /** * 添加博客索引信息 */ @PostMapping("/add") public ResponseEntity add( @RequestParam(name = "title") String title, @RequestParam(name = "author") String author, @RequestParam(name = "word_count") int wordCount, @RequestParam(name = "publish_date") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date publishDate ) { try { XContentBuilder content = XContentFactory.jsonBuilder() .startObject() .field("title", title) .field("author", author) .field("word_count", wordCount) .field("publish_date", publishDate.getTime()) .endObject(); IndexResponse result = this.transportClient.prepareIndex("blogs", "blog").setSource(content).get(); return new ResponseEntity(result.getId(), HttpStatus.OK); } catch (Exception e) { e.printStackTrace(); ; return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR); } } /** * 根据id查询 */ @GetMapping("/get") public ResponseEntity get(@RequestParam(name = "id", defaultValue = "") String id) { if (id.isEmpty()) { return new ResponseEntity((HttpStatus.NOT_FOUND)); } GetResponse result = transportClient.prepareGet("blogs", "blog", id).get(); if (!result.isExists()) { return new ResponseEntity((HttpStatus.NOT_FOUND)); } return new ResponseEntity(result.getSource(), HttpStatus.OK); } /** * 按条件查询 */ @GetMapping("/query") public ResponseEntity query( @RequestParam(name = "author", required = false) String author, @RequestParam(name = "title", required = false) String title, @RequestParam(name = "gt_word_count", defaultValue = "0") int gtWordCount, @RequestParam(name = "lt_word_count", required = false) Integer ltWordCount ) { //设置查询条件 BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); if (author != null) { boolQuery.must(QueryBuilders.matchQuery("author", author)); } if (title != null) { boolQuery.must(QueryBuilders.matchQuery("title", title)); } //按范围查询 RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("word_count").from(gtWordCount); if (ltWordCount != null && ltWordCount > 0) { rangeQuery.to(ltWordCount); } boolQuery.filter(rangeQuery); SearchRequestBuilder builder = this.transportClient.prepareSearch("blogs") .setTypes("blog") .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) .setQuery(boolQuery) //设置分页查询 .setFrom(0) .setSize(10); System.out.println(builder); SearchResponse response = builder.get(); Listresult = new ArrayList<>(); for (SearchHit hit : response.getHits()) { result.add(hit.getSourceAsMap()); } return new ResponseEntity(result, HttpStatus.OK); }}
7. 创建Application入口类
package com.yyg.boot;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;/** * @Author 一一哥Sun * @Date Created in 2020/4/9 * @Description Description */@SpringBootApplicationpublic class ElasticApplication { public static void main(String[] args) { SpringApplication.run(ElasticApplication.class, args); }}
完整项目结构:
8. 启动elastic search和kibana环境
elastic search正常启动后效果
kibana正常启动后效果
9. 在postman中进行测试
测试添加博客功能
可以看到最后返回了新增的博客id。
在kibana中进行索引的查看
在我们前面的代码中,我们已经创建了index索引为blogs,所以我们可以在kibana中把这个blogs索引同步过来。
到这一步,我们就把代码中创建好的blogs索引同步过来了,接下来我们可以查看blogs索引中的内容。
发现blogs索引中已经有了我们之前添加的博客内容。
测试按id查询博客接口
测试查询全部结果的接口

标签:
相关推荐:
最新新闻:
- daemon.exe daemon.exe进程是什么?有什么用? 环球观察
- PSN电脑怎么注册?PSN电脑上注册的步骤:当前聚焦
- tinyumbrella升级至4.21.02版本 备份更简便_独家焦点
- excel中INDEX函数怎么用?INDEX函数查询单元格的教程
- vivo云服务登录密码忘了怎么办?vivo云服务登录密码忘了解决方法 每日快播
- SpringBoot2.x系列教程54--NoSQL之整合
- 天天速看:Win10怎么添加bing搜索引擎?Win10添加bing搜索引擎的方法
- php龙之战争游戏搭建教程 龙之战争1.02正式版地图安装方法
- DirectX修复工具有什么作用?DirectX修复工具使用方法
- 如何设置时间校对同步?电脑时钟校准方法 焦点热门
- ac+是什么?ac+详情介绍
- 云盘哪个好?如何找到适合自己的网络云盘?:世界独家
- 什么是宽带网?宽带网详情介绍_环球今日讯
- 【天天播资讯】logo是什么意思?logo的中文含义
- 伦敦人被取暖账单和罢工淹没的新年
- fast无线路由器怎么设置?fast无线路由器设置方法步骤:短讯
- FTX创始人SBF拒绝认罪,10月再庭审 天天新消息
- 看视频更清晰 NV发布RTX视频超分辨率技术:快资讯
- 【天天快播报】《幻塔》获DLSS3 《死亡空间重制版》支持DLSS2
- 资讯:RTX40系笔记本电脑2月上市 售价6900元起
- 北半球“暖冬”,欧美天然气价格大跌,欧洲危机成过去式?|每日头条
- 联想台式主机仅重1007克 配12代酷睿 起售人民币2200元-全球热头条
- 预算五六千元买游戏本!选这3款一定不会采坑
- 卖不动了!苹果iPhone等四大产品线砍单:需求减弱是主因
- 3月1日起苹果全系电池涨价 要近千元:网友吐槽割韭菜:即时焦点
- Win11被打脸 PS/Office/游戏应用中Win10反而更快 全球通讯
- 《原子之心》新预告片展示华丽光线追踪和刺激战斗
- Roguelite风格FPS《巫火》DLSS3实机预告片分享
- 快消息!《三体》版权所有者游族“易主” 上海加游成最大股东
- 当前热门:RTX 40系列笔记本公布 999美元起、4050-4090都有
- M站年度评分最高游戏出炉 《艾尔登法环》成最大赢家|环球热资讯
- 踏空?懵了?昔日私募冠军回撤“创纪录”,投资老将遭遇尴尬时刻
- 环球微头条丨13代酷睿处理器+RTX 40显卡!宏碁暗影骑士系列CES焕新
- AMD新品来袭!宏碁CES推搭载锐龙7000的暗影骑士和传奇Go笔记本新品_今头条
- 资讯:宏碁推出eKinekt 酷骑桌 倡导活力永续生活方式
- 【环球快播报】居然比13代还贵 英特尔12代酷睿全线悄然涨价
- 当前动态:TrueGame平台更进一步!宏碁黑科技超级裸眼3D模式为游戏加冕
- 《神夏》主创:只要卷福华生回归 新一季明天就开搞|天天速看料
- 古巴是如何率先走出新冠疫情的?|全球观热点
- B社官网确认 《星空》将于2023年上半年发售
- 世界热讯:《艾尔登法环》获324个年度最佳奖项 破《最后生还者2》纪录
- “快银”演员亚伦·泰勒·约翰逊有望成为下一任007|天天新要闻
- 游族“卖身”,尘埃落定 天天热资讯
- 《艾尔登法环》超过《最后的生还者2》 成为年度游戏最多获得者-天天热议
- 网飞恐怖悬疑惊悚剧《1899》被砍 环球关注
- 网友吐槽世界各国的游戏女角色形象:中日韩完虐欧美?|每日热讯
- 环球即时看!世界由你开辟 PlayStation官方发布多城市户外巨屏超燃混剪
- 虎嗅【作·嗅之星】周榜第138期:世界百事通
- 辉瑞新冠口服药怎么开?什么病人可以用?上海闵行的社区医院这样做-世界聚焦
- 每日热讯!小米12s Ultra已经跌到4999元:13 Ultra快来了
- 聚焦超大规模数据中心 施耐德电气助力运营商出海建设|要闻
- iPhone 14年末立减1000 年货节大促来了_报道
- 全球热资讯!一加11明天发布:现已上架 或3799起售
- 环球最新:玩家讨论《GTAOL》中的奇怪设定:空气墙让人折磨
- 环球视点!三年后,凤仙郡终于下雨了
- 球王贝利:球技与偏见:环球观天下
- 【爆料】一加将发布 Buds Pro 2 真无线耳机,支持主动降噪 全球微头条
- CES成车展?自动驾驶、智能出行成重要主题
- 雷军宣布卢伟冰晋升为集团总裁 称正处于全新阶段的起跑线上
- 【热闻】小米雷军发布 2023 全员信,新一年关键词「稳健推进,蓄势待发」
- 腾讯、完美、字节、阿里有机会接手 暴雪被爆与国内代理谈判进入实质阶段|当前速看
- 当前观察:招聘页面显示:育碧《阿凡达:潘多拉边境》或将有游戏内商城
- 全球最资讯丨消息称暴雪与国内代理谈判进入第二阶段:与网易破镜重圆不太可能
- 天天看热讯:《转生王女与天才千金的魔法革命》新预告 1月4日开播
- 天天速讯:如何不动声色的让身边的人知道你买RTX 4090了?
- 工信部:力争2023年底全国“专精特新”中小企业超过8万家,“小巨人”超1万家
- 每日快报!如何评估全球的新冠感染死亡人数?
- 全球聚焦:全球市场开门红:欧美股市走高 纳指期货涨1% 英国富时100指数涨2%
- 2023上班第一天,三个普通打工人的复苏企盼_天天新视野
- 提升用户体验 京东超V计划服务包荣获CNMO“年度手机服务贡献奖”
- 腾讯视频号开始收费!费率1-5%!|焦点速讯
- 真我10 Pro+新年礼盒开箱:新年氛围感拉满,让我们一起10来运转_全球热推荐
- 实名羡慕 乐视官宣实行每周四天半工作制度
- 699元起售 Redmi 12C现货开售:今日快讯
- 天天热点!《流浪地球2》里的地球太不容易了:躲过四劫 依旧活着