文章共 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的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 使用 apiDoc 为你的Node.js API 自动生成文档[每日前端夜话0x78]
  2. Ansible 之 ansible-doc模块文档说明
  3. 浏览器中的JavaScript:文档对象模型与 DOM 操作[每日前端夜话0x5F
  4. GUI实战|Python做一个文档图片提取软件
  5. 如何用Python快速优雅的批量修改Word文档样式?
  6. 利用Python将PDF文档转为MP3音频
  7. Excelize 2.3.2 发布, Go 语言 Excel 文档基础库, 2021 年首个更新
  8. 来了!Python官方文档中文版
  9. 使用PHP反射机制获取函数文档

随机推荐

  1. MySQL数据操作之多表查询
  2. mysql cluster的常见问题
  3. MYSQL存储过程,函数,光标
  4. mysql转存sql脚本的时候怎么取消外键
  5. ssh项目 com.mchange.v2.c3p0.impl.NewPr
  6. PostgreSQL 高级特性入门篇
  7. [MySQL]1045 - Access denied for user '
  8. Spring 中jdbcTemplate 实现执行多条sql
  9. [求助][CAB][安装包][CF2.0][SQL][setup]
  10. Mysql数据库学习笔记(一)