日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

中间件:ElasticSearch组件RestHighLevelClient用法详解

發(fā)布時(shí)間:2025/3/16 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 中间件:ElasticSearch组件RestHighLevelClient用法详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文源碼:GitHub·點(diǎn)這里 || GitEE·點(diǎn)這里

一、基礎(chǔ)API簡(jiǎn)介

1、RestHighLevelClient

RestHighLevelClient的API作為ElasticSearch備受推薦的客戶端組件,其封裝系統(tǒng)操作ES的方法,包括索引結(jié)構(gòu)管理,數(shù)據(jù)增刪改查管理,常用查詢方法,并且可以結(jié)合原生ES查詢?cè)Z(yǔ)法,功能十分強(qiáng)大。

在使用RestHighLevelClient的語(yǔ)法時(shí),通常涉及上面幾個(gè)方面,在掌握基礎(chǔ)用法之上可以根據(jù)業(yè)務(wù)特點(diǎn)進(jìn)行一些自定義封裝,這樣可以更優(yōu)雅的解決業(yè)務(wù)需求。

2、核心依賴(lài)

使用RestHighLevelClient需要依賴(lài)rest-high-level-client包,和ES相關(guān)基礎(chǔ)依賴(lài)。

<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId> </dependency> <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId> </dependency> <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency>

二、索引管理

這里不做過(guò)多描述,注意一點(diǎn):因?yàn)镋S的數(shù)據(jù)結(jié)構(gòu)特點(diǎn),所以不需要索引更新方法,新的字段在更新數(shù)據(jù)時(shí)直接寫(xiě)入即可,不需要提前更新索引結(jié)構(gòu)。

@Service public class EsIndexOperation {@Resourceprivate RestHighLevelClient client ;private final RequestOptions options = RequestOptions.DEFAULT;/*** 判斷索引是否存在*/public boolean checkIndex (String index) {try {return client.indices().exists(new GetIndexRequest(index), options);} catch (IOException e) {e.printStackTrace();}return Boolean.FALSE ;}/*** 創(chuàng)建索引*/public boolean createIndex (String indexName ,Map<String, Object> columnMap){try {if(!checkIndex(indexName)){CreateIndexRequest request = new CreateIndexRequest(indexName);if (columnMap != null && columnMap.size()>0) {Map<String, Object> source = new HashMap<>();source.put("properties", columnMap);request.mapping(source);}this.client.indices().create(request, options);return Boolean.TRUE ;}} catch (IOException e) {e.printStackTrace();}return Boolean.FALSE;}/*** 刪除索引*/public boolean deleteIndex(String indexName) {try {if(checkIndex(indexName)){DeleteIndexRequest request = new DeleteIndexRequest(indexName);AcknowledgedResponse response = client.indices().delete(request, options);return response.isAcknowledged();}} catch (Exception e) {e.printStackTrace();}return Boolean.FALSE;} }

三、數(shù)據(jù)管理

這里在更新數(shù)據(jù)時(shí),可以直接修改索引結(jié)構(gòu),在dataMap中放進(jìn)新的字段即可。

@Service public class EsDataOperation {@Resourceprivate RestHighLevelClient client ;private final RequestOptions options = RequestOptions.DEFAULT;/*** 寫(xiě)入數(shù)據(jù)*/public boolean insert (String indexName, Map<String,Object> dataMap){try {BulkRequest request = new BulkRequest();request.add(new IndexRequest(indexName,"doc").id(dataMap.remove("id").toString()).opType("create").source(dataMap,XContentType.JSON));this.client.bulk(request, options);return Boolean.TRUE ;} catch (Exception e){e.printStackTrace();}return Boolean.FALSE;}/*** 批量寫(xiě)入數(shù)據(jù)*/public boolean batchInsert (String indexName, List<Map<String,Object>> userIndexList){try {BulkRequest request = new BulkRequest();for (Map<String,Object> dataMap:userIndexList){request.add(new IndexRequest(indexName,"doc").id(dataMap.remove("id").toString()).opType("create").source(dataMap,XContentType.JSON));}this.client.bulk(request, options);return Boolean.TRUE ;} catch (Exception e){e.printStackTrace();}return Boolean.FALSE;}/*** 更新數(shù)據(jù),可以直接修改索引結(jié)構(gòu)*/public boolean update (String indexName, Map<String,Object> dataMap){try {UpdateRequest updateRequest = new UpdateRequest(indexName,"doc", dataMap.remove("id").toString());updateRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);updateRequest.doc(dataMap) ;this.client.update(updateRequest, options);return Boolean.TRUE ;} catch (Exception e){e.printStackTrace();}return Boolean.FALSE;}/*** 刪除數(shù)據(jù)*/public boolean delete (String indexName, String id){try {DeleteRequest deleteRequest = new DeleteRequest(indexName,"doc", id);this.client.delete(deleteRequest, options);return Boolean.TRUE ;} catch (Exception e){e.printStackTrace();}return Boolean.FALSE;} }

四、查詢操作

注意:查詢總數(shù)的CountRequest語(yǔ)法,SearchRequest查詢結(jié)果中數(shù)據(jù)轉(zhuǎn)換語(yǔ)法,分頁(yè)查詢中需要指定偏移位置和分頁(yè)大小。

@Service public class EsQueryOperation {@Resourceprivate RestHighLevelClient client ;private final RequestOptions options = RequestOptions.DEFAULT;/*** 查詢總數(shù)*/public Long count (String indexName){// 指定創(chuàng)建時(shí)間BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();queryBuilder.must(QueryBuilders.termQuery("createTime", 1611378102795L));SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(queryBuilder);CountRequest countRequest = new CountRequest(indexName);countRequest.source(sourceBuilder);try {CountResponse countResponse = client.count(countRequest, options);return countResponse.getCount();} catch (Exception e) {e.printStackTrace();}return 0L;}/*** 查詢集合*/public List<Map<String,Object>> list (String indexName) {// 查詢條件,指定時(shí)間并過(guò)濾指定字段值SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();queryBuilder.must(QueryBuilders.termQuery("createTime", 1611378102795L));queryBuilder.mustNot(QueryBuilders.termQuery("name","北京-李四"));sourceBuilder.query(queryBuilder);SearchRequest searchRequest = new SearchRequest(indexName);searchRequest.source(sourceBuilder);try {SearchResponse searchResp = client.search(searchRequest, options);List<Map<String,Object>> data = new ArrayList<>() ;SearchHit[] searchHitArr = searchResp.getHits().getHits();for (SearchHit searchHit:searchHitArr){Map<String,Object> temp = searchHit.getSourceAsMap();temp.put("id",searchHit.getId()) ;data.add(temp);}return data;} catch (Exception e) {e.printStackTrace();}return null ;}/*** 分頁(yè)查詢*/public List<Map<String,Object>> page (String indexName,Integer offset,Integer size) {// 查詢條件,指定時(shí)間并過(guò)濾指定字段值SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.from(offset);sourceBuilder.size(size);sourceBuilder.sort("createTime", SortOrder.DESC);SearchRequest searchRequest = new SearchRequest(indexName);searchRequest.source(sourceBuilder);try {SearchResponse searchResp = client.search(searchRequest, options);List<Map<String,Object>> data = new ArrayList<>() ;SearchHit[] searchHitArr = searchResp.getHits().getHits();for (SearchHit searchHit:searchHitArr){Map<String,Object> temp = searchHit.getSourceAsMap();temp.put("id",searchHit.getId()) ;data.add(temp);}return data;} catch (Exception e) {e.printStackTrace();}return null ;} }

五、排序方式

排序除了常規(guī)的指定字段升序降序規(guī)則之外,還可以基于原生的腳本語(yǔ)法,基于自定義規(guī)則排序讓一些特定的數(shù)據(jù)沉底或者置頂。

@Service public class EsSortOperation {@Resourceprivate RestHighLevelClient client ;private final RequestOptions options = RequestOptions.DEFAULT;/*** 排序規(guī)則*/public List<Map<String,Object>> sort (String indexName) {// 先升序時(shí)間,在倒序年齡SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.sort("createTime", SortOrder.ASC);sourceBuilder.sort("age",SortOrder.DESC) ;SearchRequest searchRequest = new SearchRequest(indexName);searchRequest.source(sourceBuilder);try {SearchResponse searchResp = client.search(searchRequest, options);List<Map<String,Object>> data = new ArrayList<>() ;SearchHit[] searchHitArr = searchResp.getHits().getHits();for (SearchHit searchHit:searchHitArr){Map<String,Object> temp = searchHit.getSourceAsMap();temp.put("id",searchHit.getId()) ;data.add(temp);}return data;} catch (Exception e) {e.printStackTrace();}return null ;}/*** 自定義排序規(guī)則*/public List<Map<String,Object>> defSort (String indexName) {// 指定置換順序的規(guī)則// [age 12-->60]\[age 19-->10]\[age 13-->30]\[age 18-->40],age其他值忽略為1Script script = new Script("def _ageSort = doc['age'].value == 12?60:" +"(doc['age'].value == 19?10:" +"(doc['age'].value == 13?30:" +"(doc['age'].value == 18?40:1)));" + "_ageSort;");ScriptSortBuilder sortBuilder = SortBuilders.scriptSort(script,ScriptSortBuilder.ScriptSortType.NUMBER);sortBuilder.order(SortOrder.ASC);SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.sort(sortBuilder);SearchRequest searchRequest = new SearchRequest(indexName);searchRequest.source(sourceBuilder);try {SearchResponse searchResp = client.search(searchRequest, options);List<Map<String,Object>> data = new ArrayList<>() ;SearchHit[] searchHitArr = searchResp.getHits().getHits();for (SearchHit searchHit:searchHitArr){Map<String,Object> temp = searchHit.getSourceAsMap();temp.put("id",searchHit.getId()) ;data.add(temp);}return data;} catch (Exception e) {e.printStackTrace();}return null ;} }

六、源代碼地址

GitHub·地址 https://github.com/cicadasmile/data-manage-parent GitEE·地址 https://gitee.com/cicadasmile/data-manage-parent

推薦閱讀:編程體系整理

序號(hào)項(xiàng)目名稱(chēng)GitHub地址GitEE地址推薦指數(shù)
01Java描述設(shè)計(jì)模式,算法,數(shù)據(jù)結(jié)構(gòu)GitHub·點(diǎn)這里GitEE·點(diǎn)這里☆☆☆☆☆
02Java基礎(chǔ)、并發(fā)、面向?qū)ο蟆eb開(kāi)發(fā)GitHub·點(diǎn)這里GitEE·點(diǎn)這里☆☆☆☆
03SpringCloud微服務(wù)基礎(chǔ)組件案例詳解GitHub·點(diǎn)這里GitEE·點(diǎn)這里☆☆☆
04SpringCloud微服務(wù)架構(gòu)實(shí)戰(zhàn)綜合案例GitHub·點(diǎn)這里GitEE·點(diǎn)這里☆☆☆☆☆
05SpringBoot框架基礎(chǔ)應(yīng)用入門(mén)到進(jìn)階GitHub·點(diǎn)這里GitEE·點(diǎn)這里☆☆☆☆
06SpringBoot框架整合開(kāi)發(fā)常用中間件GitHub·點(diǎn)這里GitEE·點(diǎn)這里☆☆☆☆☆
07數(shù)據(jù)管理、分布式、架構(gòu)設(shè)計(jì)基礎(chǔ)案例GitHub·點(diǎn)這里GitEE·點(diǎn)這里☆☆☆☆☆
08大數(shù)據(jù)系列、存儲(chǔ)、組件、計(jì)算等框架GitHub·點(diǎn)這里GitEE·點(diǎn)這里☆☆☆☆☆

總結(jié)

以上是生活随笔為你收集整理的中间件:ElasticSearch组件RestHighLevelClient用法详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。