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)) ? "更新文檔成功" : "更新文檔失敗"; }
因爲能力有限,如有錯誤或者不當之處,還請你們批評指正,一塊兒學習交流!