自制一個 elasticsearch-spring-boot-starter

Samsung Galaxy S10


概 述

Elasticsearch 在企業裏落地的場景愈來愈多了,可是你們在項目裏使用 Elasticsearch的姿式也是千奇百怪,此次正好本身須要使用,因此乾脆就封裝一個 elasticsearch-spring-boot-starter以供複用好了。若是不知道 spring-boot-starter該如何製做,能夠參考文章《如何自制一個Spring Boot Starter並推送到遠端公服》,下面就來簡述一下自制的 elasticsearch-spring-boot-starter該如何使用。java


依賴引入

<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

各個字段解釋以下:git

  • host:Elasticsearch 節點地址
  • httpPort: Elasticsearch REST端口
  • tcpPort:Elasticsearch TCP端口
  • clusterName:集羣名
  • docFields:文檔字段,以英文逗號間隔,好比我這裏的業務場景是文檔包含 標題(title)內容(filecontent)字段
  • auth:是否須要權限認證

因爲我這裏安裝的實驗集羣並沒有 x-pack權限認證的加持,所以無需權限認證,實際使用的集羣或者阿里雲上的 Elasticsearch集羣均有完善的 x-pack權限認證,此時能夠加上用戶名/密碼的配置:github

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中定義的spring

  • 建立索引
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)) ? "更新文檔成功" : "更新文檔失敗";
}

後 記

因爲能力有限,如有錯誤或者不當之處,還請你們批評指正,一塊兒學習交流!
相關文章
相關標籤/搜索