一、導(dǎo)入elasticsearch依賴
在pom.xml里加入如下依賴
org.springframework.boot spring-boot-starter-data-elasticsearch
非常重要:檢查依賴版本是否與你當(dāng)前所用的版本是否一致,如果不一致,會(huì)連接失敗!
基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
視頻教程:https://doc.iocoder.cn/video/
二、創(chuàng)建高級(jí)客戶端
importorg.apache.http.HttpHost; importorg.elasticsearch.client.RestClient; importorg.elasticsearch.client.RestHighLevelClient; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; @Configuration publicclassElasticSearchClientConfig{ @Bean publicRestHighLevelClientrestHighLevelClient(){ RestHighLevelClientclient=newRestHighLevelClient( RestClient.builder( newHttpHost("服務(wù)器IP",9200,"http"))); returnclient; } }
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud
視頻教程:https://doc.iocoder.cn/video/
三、基本用法
1.創(chuàng)建、判斷存在、刪除索引
importorg.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; importorg.elasticsearch.action.support.master.AcknowledgedResponse; importorg.elasticsearch.client.RequestOptions; importorg.elasticsearch.client.RestHighLevelClient; importorg.elasticsearch.client.indices.CreateIndexRequest; importorg.elasticsearch.client.indices.CreateIndexResponse; importorg.elasticsearch.client.indices.GetIndexRequest; importorg.junit.jupiter.api.Test; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.boot.test.context.SpringBootTest; importjava.io.IOException; @SpringBootTest classElasticsearchApplicationTests{ @Autowired privateRestHighLevelClientrestHighLevelClient; @Test voidtestCreateIndex()throwsIOException{ //1.創(chuàng)建索引請(qǐng)求 CreateIndexRequestrequest=newCreateIndexRequest("ljx666"); //2.客戶端執(zhí)行請(qǐng)求IndicesClient,執(zhí)行create方法創(chuàng)建索引,請(qǐng)求后獲得響應(yīng) CreateIndexResponseresponse= restHighLevelClient.indices().create(request,RequestOptions.DEFAULT); System.out.println(response); } @Test voidtestExistIndex()throwsIOException{ //1.查詢索引請(qǐng)求 GetIndexRequestrequest=newGetIndexRequest("ljx666"); //2.執(zhí)行exists方法判斷是否存在 booleanexists=restHighLevelClient.indices().exists(request,RequestOptions.DEFAULT); System.out.println(exists); } @Test voidtestDeleteIndex()throwsIOException{ //1.刪除索引請(qǐng)求 DeleteIndexRequestrequest=newDeleteIndexRequest("ljx666"); //執(zhí)行delete方法刪除指定索引 AcknowledgedResponsedelete=restHighLevelClient.indices().delete(request,RequestOptions.DEFAULT); System.out.println(delete.isAcknowledged()); } }
2.對(duì)文檔的CRUD
創(chuàng)建文檔:
注意:如果添加時(shí)不指定文檔ID,他就會(huì)隨機(jī)生成一個(gè)ID,ID唯一。
創(chuàng)建文檔時(shí)若該ID已存在,發(fā)送創(chuàng)建文檔請(qǐng)求后會(huì)更新文檔中的數(shù)據(jù)。
@Test voidtestAddUser()throwsIOException{ //1.創(chuàng)建對(duì)象 Useruser=newUser("Go",21,newString[]{"內(nèi)卷","吃飯"}); //2.創(chuàng)建請(qǐng)求 IndexRequestrequest=newIndexRequest("ljx666"); //3.設(shè)置規(guī)則PUT/ljx666/_doc/1 //設(shè)置文檔id=6,設(shè)置超時(shí)=1s等,不設(shè)置會(huì)使用默認(rèn)的 //同時(shí)支持鏈?zhǔn)?a target="_blank">編程如request.id("6").timeout("1s"); request.id("6"); request.timeout("1s"); //4.將數(shù)據(jù)放入請(qǐng)求,要將對(duì)象轉(zhuǎn)化為json格式 //XContentType.JSON,告訴它傳的數(shù)據(jù)是JSON類型 request.source(JSONValue.toJSONString(user),XContentType.JSON); //5.客戶端發(fā)送請(qǐng)求,獲取響應(yīng)結(jié)果 IndexResponseindexResponse=restHighLevelClient.index(request,RequestOptions.DEFAULT); System.out.println(indexResponse.toString()); System.out.println(indexResponse.status()); }
獲取文檔中的數(shù)據(jù):
@Test voidtestGetUser()throwsIOException{ //1.創(chuàng)建請(qǐng)求,指定索引、文檔id GetRequestrequest=newGetRequest("ljx666","1"); GetResponsegetResponse=restHighLevelClient.get(request,RequestOptions.DEFAULT); System.out.println(getResponse);//獲取響應(yīng)結(jié)果 //getResponse.getSource()返回的是Map集合 System.out.println(getResponse.getSourceAsString());//獲取響應(yīng)結(jié)果source中內(nèi)容,轉(zhuǎn)化為字符串 }
更新文檔數(shù)據(jù):
注意:需要將User對(duì)象中的屬性全部指定值,不然會(huì)被設(shè)置為空,如User只設(shè)置了名稱,那么只有名稱會(huì)被修改成功,其他會(huì)被修改為null。
@Test voidtestUpdateUser()throwsIOException{ //1.創(chuàng)建請(qǐng)求,指定索引、文檔id UpdateRequestrequest=newUpdateRequest("ljx666","6"); Useruser=newUser("GoGo",21,newString[]{"內(nèi)卷","吃飯"}); //將創(chuàng)建的對(duì)象放入文檔中 request.doc(JSONValue.toJSONString(user),XContentType.JSON); UpdateResponseupdateResponse=restHighLevelClient.update(request,RequestOptions.DEFAULT); System.out.println(updateResponse.status());//更新成功返回OK }
刪除文檔:
@Test voidtestDeleteUser()throwsIOException{ //創(chuàng)建刪除請(qǐng)求,指定要?jiǎng)h除的索引與文檔ID DeleteRequestrequest=newDeleteRequest("ljx666","6"); DeleteResponseupdateResponse=restHighLevelClient.delete(request,RequestOptions.DEFAULT); System.out.println(updateResponse.status());//刪除成功返回OK,沒有找到返回NOT_FOUND }
3.批量CRUD數(shù)據(jù)
這里只列出了批量插入數(shù)據(jù),其他與此類似
注意:hasFailures()方法是返回是否失敗,即它的值為false時(shí)說(shuō)明上傳成功
@Test voidtestBulkAddUser()throwsIOException{ BulkRequestbulkRequest=newBulkRequest(); //設(shè)置超時(shí) bulkRequest.timeout("10s"); ArrayListlist=newArrayList<>(); list.add(newUser("Java",25,newString[]{"內(nèi)卷"})); list.add(newUser("Go",18,newString[]{"內(nèi)卷"})); list.add(newUser("C",30,newString[]{"內(nèi)卷"})); list.add(newUser("C++",26,newString[]{"內(nèi)卷"})); list.add(newUser("Python",20,newString[]{"內(nèi)卷"})); intid=1; //批量處理請(qǐng)求 for(Useru:list){ //不設(shè)置id會(huì)生成隨機(jī)id bulkRequest.add(newIndexRequest("ljx666") .id(""+(id++)) .source(JSONValue.toJSONString(u),XContentType.JSON)); } BulkResponsebulkResponse=restHighLevelClient.bulk(bulkRequest,RequestOptions.DEFAULT); System.out.println(bulkResponse.hasFailures());//是否執(zhí)行失敗,false為執(zhí)行成功 }
4.查詢所有、模糊查詢、分頁(yè)查詢、排序、高亮顯示
@Test voidtestSearch()throwsIOException{ SearchRequestsearchRequest=newSearchRequest("ljx666");//里面可以放多個(gè)索引 SearchSourceBuildersourceBuilder=newSearchSourceBuilder();//構(gòu)造搜索條件 //此處可以使用QueryBuilders工具類中的方法 //1.查詢所有 sourceBuilder.query(QueryBuilders.matchAllQuery()); //2.查詢name中含有Java的 sourceBuilder.query(QueryBuilders.multiMatchQuery("java","name")); //3.分頁(yè)查詢 sourceBuilder.from(0).size(5); //4.按照score正序排列 //sourceBuilder.sort(SortBuilders.scoreSort().order(SortOrder.ASC)); //5.按照id倒序排列(score會(huì)失效返回NaN) //sourceBuilder.sort(SortBuilders.fieldSort("_id").order(SortOrder.DESC)); //6.給指定字段加上指定高亮樣式 HighlightBuilderhighlightBuilder=newHighlightBuilder(); highlightBuilder.field("name").preTags("").postTags(""); sourceBuilder.highlighter(highlightBuilder); searchRequest.source(sourceBuilder); SearchResponsesearchResponse=restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT); //獲取總條數(shù) System.out.println(searchResponse.getHits().getTotalHits().value); //輸出結(jié)果數(shù)據(jù)(如果不設(shè)置返回條數(shù),大于10條默認(rèn)只返回10條) SearchHit[]hits=searchResponse.getHits().getHits(); for(SearchHithit:hits){ System.out.println("分?jǐn)?shù):"+hit.getScore()); Mapsource=hit.getSourceAsMap(); System.out.println("index->"+hit.getIndex()); System.out.println("id->"+hit.getId()); for(Map.Entry s:source.entrySet()){ System.out.println(s.getKey()+"--"+s.getValue()); } } }
四、總結(jié)
1.大致流程
創(chuàng)建對(duì)應(yīng)的請(qǐng)求 --> 設(shè)置請(qǐng)求(添加規(guī)則,添加數(shù)據(jù)等) --> 執(zhí)行對(duì)應(yīng)的方法(傳入請(qǐng)求,默認(rèn)請(qǐng)求選項(xiàng))–> 接收響應(yīng)結(jié)果(執(zhí)行方法返回值)–> 輸出響應(yīng)結(jié)果中需要的數(shù)據(jù)(source,status等)
2.注意事項(xiàng)
如果不指定id,會(huì)自動(dòng)生成一個(gè)隨機(jī)id
正常情況下,不應(yīng)該這樣使用new IndexRequest(“l(fā)jx777”),如果索引發(fā)生改變了,那么代碼都需要修改,可以定義一個(gè)枚舉類或者一個(gè)專門存放常量的類,將變量用final static等進(jìn)行修飾,并指定索引值。其他地方引用該常量即可,需要修改也只需修改該類即可。
elasticsearch相關(guān)的東西,版本都必須一致,不然會(huì)報(bào)錯(cuò)
elasticsearch很消耗內(nèi)存,建議在內(nèi)存較大的服務(wù)器上運(yùn)行elasticsearch,否則會(huì)因?yàn)閮?nèi)存不足導(dǎo)致elasticsearch自動(dòng)killed。
審核編輯:劉清
-
RBAC
+關(guān)注
關(guān)注
0文章
44瀏覽量
10132 -
SpringBoot
+關(guān)注
關(guān)注
0文章
175瀏覽量
293
原文標(biāo)題:SpringBoot+ElasticSearch 實(shí)現(xiàn)模糊查詢,批量CRUD,排序,分頁(yè),高亮
文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
SpringBoot整合ElasticSearch

分析一下MySQL數(shù)據(jù)庫(kù)與ElasticSearch的實(shí)際應(yīng)用
英漢電子詞典按音查詢的設(shè)計(jì)
Delphi教程之標(biāo)準(zhǔn)/模糊查詢
為什么ElasticSearch復(fù)雜條件查詢比MySQL好?

ElasticSearch是什么?應(yīng)用場(chǎng)景是什么?
SpringBoot模板分類樹查詢功能介紹

SpringBoot 連接ElasticSearch的使用方式
Redis的分頁(yè)+多條件模糊查詢組合實(shí)現(xiàn)方案

評(píng)論