自制一个 elasticsearch-spring-boot-starter
文章共 500字,阅读大约需要 2分钟,文尾有计时器可自行对时!
概 述
Elasticsearch 在企业里落地的场景越来越多了,但是大家在项目里使用 Elasticsearch的姿势也是千奇百怪,这次正好自己需要使用,所以干脆就封装一个 elasticsearch-spring-boot-starter 以供复用好了。如果不知道 spring-boot-starter该如何制作,可以参考文章《如何自制一个Spring Boot Starter并推送到远端公服》,下面就来简述一下自制的 elasticsearch-spring-boot-starter该如何使用。
注: 本文首发于 作者公众号 CodeSheep ,可 长按 / 扫描 下面的 小心心 来订阅 ↓ ↓ ↓
依赖引入
<dependency> <groupId>com.github.hansonwang99</groupId> <artifactId>elasticsearch-spring-boot-starter</artifactId> <version>0.0.8</version></dependency><repositories> <repository> <id>jitpack.io</id> <url>https://jitpack.io</url> </repository></repositories>
配置文件
如果你还没有一个属于自己的 Elasticsearch集群,可以参考文章 《CentOS7 上搭建多节点 Elasticsearch集群》来一步步搭建之,本文实验所用的集群即来源于此。
elasticsearch: host: 192.168.31.75 httpPort: 9200 tcpPort: 9300 clusterName: codesheep docFields: title,filecontent auth: enable: false
各个字段解释如下:
host:Elasticsearch 节点地址
httpPort: Elasticsearch REST端口
tcpPort:Elasticsearch TCP端口
clusterName:集群名
docFields:文档字段,以英文逗号间隔,比如我这里的业务场景是文档包含 标题(title)和 内容(filecontent)字段
- auth:是否需要权限认证
由于我这里安装的实验集群并无 x-pack权限认证的加持,因此无需权限认证,实际使用的集群或者阿里云上的 Elasticsearch集群均有完善的 x-pack权限认证,此时可以加上用户名/密码的配置:
elasticsearch: host: 192.168.199.75 httpPort: 9200 tcpPort: 9300 clusterName: codesheep docFields: title,filecontent auth: enable: true username: elasticsearch password: xxxxxx
用法例析
- 首先注入相关资源
@Autowired private ISearchService iSearchService; @Autowired private DocModel docModel;
这些都是在 elasticsearch-spring-boot-starter中定义的
- 创建索引
public String createIndex() throws IOException { IndexModel indexModel = new IndexModel(); indexModel.setIndexName("testindex2"); // 注意索引名字必须小写,否则ES抛异常 indexModel.setTypeName("testtype2"); indexModel.setReplicaNumber( 2 ); // 两个节点,因此两个副本 indexModel.setShardNumber( 3 ); XContentBuilder builder = null; builder = XContentFactory.jsonBuilder(); builder.startObject(); { builder.startObject("properties"); { builder.startObject("title"); { builder.field("type", "text"); builder.field("analyzer", "ik_max_word"); } builder.endObject(); builder.startObject("filecontent"); { builder.field("type", "text"); builder.field("analyzer", "ik_max_word"); builder.field("term_vector", "with_positions_offsets"); } builder.endObject(); } builder.endObject(); } builder.endObject(); indexModel.setBuilder( builder ); Boolean res = iSearchService.createIndex(indexModel); if( true==res ) return "创建索引成功"; else return "创建索引失败"; }
- 删除索引
public String deleteIndex() { return (iSearchService.deleteIndex("testindex2")==true) ? "删除索引成功":"删除索引失败"; }
- 判断索引是否存在
if ( existIndex(indexName) ) { ... } else { ... }
- 插入单个文档
public String insertSingleDoc( ) { SingleDoc singleDoc = new SingleDoc(); singleDoc.setIndexName("testindex2"); singleDoc.setTypeName("testtype2"); Map<String,Object> doc = new HashMap<>(); doc.put("title","人工智能标题1"); doc.put("filecontent","人工智能内容1"); singleDoc.setDocMap(doc); return ( true== iSearchService.insertDoc( singleDoc ) ) ? "插入单个文档成功" : "插入单个文档失败"; }
- 批量插入文档
public String insertDocBatch() { BatchDoc batchDoc = new BatchDoc(); batchDoc.setIndexName("testindex2"); batchDoc.setTypeName("testtype2"); Map<String,Object> doc1 = new HashMap<>(); doc1.put("title","人工智能标题1"); doc1.put("filecontent","人工智能内容1"); Map<String,Object> doc2 = new HashMap<>(); doc2.put("title","人工智能标题2"); doc2.put("filecontent","人工智能内容2"); Map<String,Object> doc3 = new HashMap<>(); doc3.put("title","人工智能标题3"); doc3.put("filecontent","人工智能内容3"); Map<String,Object> doc4 = new HashMap<>(); doc4.put("title","人工智能标题4"); doc4.put("filecontent","人工智能内容4"); List<Map<String,Object>> docList = new ArrayList<>(); docList.add( doc1 ); docList.add( doc2 ); docList.add( doc3 ); docList.add( doc4 ); batchDoc.setBatchDocMap( docList ); return ( true== iSearchService.insertDocBatch( batchDoc ) ) ? "批量插入文档成功" : "批量插入文档失败"; }
- 搜索文档
public List<Map<String,Object>> searchDoc() { SearchModel searchModel = new SearchModel(); searchModel.setIndexName( "testindex2" ); List<String> fields = new ArrayList<>(); fields.add("title"); fields.add("filecontent"); fields.add("id"); searchModel.setFields( fields ); searchModel.setKeyword( "人工" ); searchModel.setPageNum( 1 ); searchModel.setPageSize( 5 ); return iSearchService.queryDocs( searchModel ); }
- 删除文档
public String deleteDoc() { SingleDoc singleDoc = new SingleDoc(); singleDoc.setIndexName("testindex2"); singleDoc.setTypeName("testtype2"); singleDoc.setId("vPHMY2cBcGZ3je_1EgIM"); return (true== iSearchService.deleteDoc(singleDoc)) ? "删除文档成功" : "删除文档失败"; }
- 批量删除文档
public String deleteDocBatch() { BatchDoc batchDoc = new BatchDoc(); batchDoc.setIndexName("testindex2"); batchDoc.setTypeName("testtype2"); List<String> ids = new ArrayList<>(); ids.add("vfHMY2cBcGZ3je_1EgIM"); ids.add("vvHMY2cBcGZ3je_1EgIM"); batchDoc.setDocIds( ids ); return ( true== iSearchService.deleteDocBatch(batchDoc) ) ? "批量删除文档成功" : "批量删除文档失败"; }
- 更新文档
public String updateDoc( @RequestBody SingleDoc singleDoc ) { SingleDoc singleDoc = new SingleDoc(); singleDoc.setId("wPH6Y2cBcGZ3je_1OwI7"); singleDoc.setIndexName("testindex2"); singleDoc.setTypeName("testtype2"); Map<String,Object> doc = new HashMap<>(); doc.put("title","人工智能标题(更新后)"); doc.put("filecontent","人工智能内容(更新后)"); singleDoc.setUpdateDocMap(doc); return (true== iSearchService.updateDoc(singleDoc)) ? "更新文档成功" : "更新文档失败"; }
后 记
由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!
个人网站:www.codesheep.cn (程序羊)
我的更多系列原创文章在此:
● 程序羊的2018年终总(gen)结(feng)
● 利用K8S技术栈打造个人私有云系列连载文章
● 从一份配置清单详解Nginx服务器配置
● Spring Boot Admin 2.0开箱体验
● 一文上手 Elasticsearch常用可视化管理工具
● Docker容器可视化监控中心搭建
● 利用ELK搭建Docker容器化应用日志中心
● RPC框架实践之:Google gRPC
● 一文详解 Linux系统常用监控工具
作者更多 务实、能看懂、可复现的 原创文章尽在公众号 CodeSheep,欢迎订阅 ⬇️⬇️⬇️
©著作权归作者所有:来自51CTO博客作者mb5fdcae83766b7的原创作品,如需转载,请注明出处,否则将追究法律责任更多相关文章
- 使用 apiDoc 为你的Node.js API 自动生成文档[每日前端夜话0x78]
- Ansible 之 ansible-doc模块文档说明
- 浏览器中的JavaScript:文档对象模型与 DOM 操作[每日前端夜话0x5F
- GUI实战|Python做一个文档图片提取软件
- 如何用Python快速优雅的批量修改Word文档样式?
- 利用Python将PDF文档转为MP3音频
- Excelize 2.3.2 发布, Go 语言 Excel 文档基础库, 2021 年首个更新
- 来了!Python官方文档中文版
- 使用PHP反射机制获取函数文档