自制一个 elasticsearch-spring-boot-starter

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: 概 述 Elasticsearch 在企业里落地的场景越来越多了,但是大家在项目里使用 Elasticsearch的姿势也是千奇百怪,这次正好自己需要使用,所以干脆就封装一个 elasticsearch-spring-boot-starter以供复用好了。

Samsung Galaxy S10


概 述

Elasticsearch 在企业里落地的场景越来越多了,但是大家在项目里使用 Elasticsearch的姿势也是千奇百怪,这次正好自己需要使用,所以干脆就封装一个 elasticsearch-spring-boot-starter以供复用好了。如果不知道 spring-boot-starter该如何制作,可以参考文章《如何自制一个Spring Boot Starter并推送到远端公服》,下面就来简述一下自制的 elasticsearch-spring-boot-starter该如何使用。


依赖引入

<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)) ? "更新文档成功" : "更新文档失败";
}
相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
目录
相关文章
|
SQL JSON Java
【Elasticsearch专栏 10】深入探索:Elasticsearch如何进行数据导入和导出
在Elasticsearch中,数据导入常通过Bulk API、Logstash或Java客户端进行,支持JSON、CSV等格式。导出则可通过SQL查询、Scroll API或第三方工具如elasticdump实现,将数据以JSON、CSV等格式导出。这些方法确保了数据的高效、安全导入与导出。
1628 5
|
Java 数据库连接 应用服务中间件
【Maven】依赖范围、依赖传递、依赖排除、依赖原则、依赖继承
在Maven中,依赖范围(Dependency Scope)用于控制依赖项在编译、测试和运行时的可见性和可用性。通过指定适当的依赖范围,可以在不同的构建和执行环境中控制依赖项的加载和使用。
1445 1
|
Java API Spring
史上最全AOP 切面表达式,看完逼格有提升了
史上最全AOP 切面表达式,看完逼格有提升了。源码已放开头了,请你查收。
1513 0
|
Java Spring
spring data elasticsearch: 设置保活策略|长时间不连接es,报错超时连接
java client长时间没有连接es后,再次调用访问接口,报错连接超时
2409 0
|
关系型数据库 MySQL Go
使用go-mysql-elasticsearch同步mysql数据库信息到ElasticSearch
本文介绍如何使用go-mysql-elasticsearch同步mysql数据库信息到ElasticSearch。1.go-mysql-elasticsearch简介go-mysql-elasticsearch是一个将MySQL数据自动同步到Elasticsearch的服务。
4572 0
|
12月前
|
缓存 Java 开发者
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
830 6
|
11月前
|
存储 API 数据安全/隐私保护
推荐一款轻量级且强大的 Elasticsearch GUI : elasticvue
很多同学都是用过 Elasticsearch 的 GUI 工具 Kibana ,但 Kibana 相对比较重,这篇文章,笔者推荐推荐一款**轻量级**且**强大**的 Elasticsearch GUI : **elasticvue** 。
 推荐一款轻量级且强大的 Elasticsearch GUI : elasticvue
|
算法 数据可视化 Java
JAVA规则引擎工具有哪些?
本文对比分析了六种Java规则引擎:Drools、IBM ODM (JRules)、Easy Rules、JBPM、OpenL Tablets以及Apache Camel结合规则组件的应用。Drools是一款功能全面的业务规则管理系统,支持DRL文件定义规则、高效的规则匹配算法、复杂的规则流及决策表,并易于与Java应用集成。IBM ODM (原JRules)提供了强大的规则管理功能,包括Web界面和Eclipse插件定义管理规则、直观的决策表和决策树、REST和Java API集成选项及优化的性能。
2263 3
|
存储 Java 应用服务中间件
Java规则引擎Drools急速入门
Java规则引擎Drools急速入门
Java规则引擎Drools急速入门
|
SQL Java 编译器
Seata常见问题之记录的Select SQL出现 For Update如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集