本文作者:羅海鵬煌往,叩丁狼高級講師。原創(chuàng)文章轧邪,轉(zhuǎn)載請注明出處刽脖。
前言
??到目前為止,我們一直都是使用RESTful風(fēng)格的 API操作elasticsearch服務(wù)闲勺,但是通過我們之前的學(xué)習(xí)知道曾棕,elasticsearch提供了很多語言的客戶端用于操作elasticsearch服務(wù)扣猫,例如:java菜循、python、.net申尤、JavaScript癌幕、PHP等。而我們此次就學(xué)習(xí)如何使用java語言來操作elasticsearch服務(wù)昧穿。在elasticsearch的官網(wǎng)上提供了兩種java語言的API勺远,一種是Java Transport Client,一種是Java REST Client时鸵。
??而Java REST Client又分為Java Low Level REST Client和Java High Level REST Client胶逢,Java High Level REST Client是在Java Low Level REST Client的基礎(chǔ)上做了封裝,使其以更加面向?qū)ο蠛筒僮鞲颖憷姆绞秸{(diào)用elasticsearch服務(wù)饰潜。
??官方推薦使用Java High Level REST Client初坠,因為在實(shí)際使用中甘畅,Java Transport Client在大并發(fā)的情況下會出現(xiàn)連接不穩(wěn)定的情況亡电。
??那接下來我們就來看看elasticsearch提供的Java High Level REST Client(以下簡稱高級REST客戶端)的一些基礎(chǔ)的操作,跟多的操作大家自行閱讀elasticsearch的官方文檔:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html
在官網(wǎng)上已經(jīng)對高級REST客戶端的各種API做了很詳細(xì)的使用說明除抛,我們這篇文章主要還是翻譯官網(wǎng)上的內(nèi)容薯酝,先讓大家以更友好的中文文檔方式入門半沽,等大家熟悉了這些API之后在查閱官網(wǎng)爽柒。
測試項目
??在這里我也做了一個高級REST客戶端的使用測試,該測試項目使用springboot開發(fā)者填,并且使用反射和泛型做了簡易的封裝浩村,加強(qiáng)通用性。該項目的GitHub地址在以下鏈接:
高級REST客戶端使用
導(dǎo)入依賴
我們這里以maven為例占哟,使用高級REST客戶端需要兩個依賴穴亏,分別是:
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.2.4</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.2.4</version>
</dependency>
這兩個依賴的版本是跟elasticsearch服務(wù)版本同步更新的,所以選擇的依賴版本無需按照我這里的版本重挑,而是以自己的elasticsearch服務(wù)的版本為主嗓化。
初始化
首先,我們想要操作elasticsearch谬哀,那必須先創(chuàng)建出連接的客戶端對象刺覆,創(chuàng)建客戶端對象的API如下:
String[] ips = {"192.168.85.133:9200","192.168.85.133:9400"}
HttpHost[] httpHosts = new HttpHost[ips.length];
for(int i=0;i<ips.length;i++){
httpHosts[i] = HttpHost.create(ips[i]);
}
RestClientBuilder builder = RestClient.builder(httpHosts);
RestHighLevelClient client = new RestHighLevelClient(builder);
得到的RestHighLevelClient對象就是我們接下來操作elasticsearch所需要的了。
插入和更新文檔操作
插入和更新文檔需要我們構(gòu)建一個IndexRequest對象史煎。
- 構(gòu)造方法:
IndexRequest(String index, String type, String id)
第一個參數(shù)是該文檔插入到哪個索引中谦屑,第二個參數(shù)是該文檔插入到哪個文檔類型中,第三個參數(shù)是指定文檔的id篇梭。 - 設(shè)置文檔內(nèi)容方法:
source()
該方法有多個重載方法氢橙,我們可以把文檔內(nèi)容以json字符串的方式傳遞,也可以以xml方式傳遞恬偷,還可以用Map方式傳遞悍手。 - 更新文檔操作:調(diào)用高級REST客戶端的index方法,并傳入IndexRequest對象袍患。
具體代碼如下:
public void insertOrUpdate(Object o) throws Exception {
Map map = BeanUtil.bean2Map(o);
IndexRequest request = new IndexRequest(baseIndex, baseType, map.get("id")+"");
request.source(map);
client.index(request);
}
通過文檔id刪除文檔
刪除文檔操作需要創(chuàng)建DeleteRequest對象坦康。
- 構(gòu)造方法:常用的構(gòu)造方法:
DeleteRequest(String index, String type, String id)
第一個參數(shù)代表將要刪除的該文檔所在的索引,第二個參數(shù)代表將要刪除的索引所在的文檔類型诡延,第三個參數(shù)代表要刪除的文檔對應(yīng)的id - 刪除文檔:調(diào)用高級REST客戶端的delete方法滞欠,并傳入DeleteRequest對象。
具體代碼如下:
public void delete(Long id) throws Exception {
DeleteRequest request = new DeleteRequest(baseIndex, baseType, id + "");
client.delete(request);
}
通過文檔id獲取文檔
通過文檔id獲取文檔需要創(chuàng)建GetRequest對象肆良。
- 構(gòu)造方法:常用構(gòu)造方法:
GetRequest(String index, String type, String id)
第一個參數(shù)代表要獲取的文檔所在的索引筛璧,第二個參數(shù)代表要獲取的索引所在的文檔類型,第三個參數(shù)代表要獲取的文檔對應(yīng)的id - 獲取文檔:調(diào)用高級REST客戶端的get方法惹恃,并傳入GetRequest對象夭谤。
- 返回結(jié)果:返回GetResponse對象,可以使用該對象的getSource()方法座舍,獲得文檔數(shù)據(jù)沮翔,該數(shù)據(jù)封裝成Map對象。
具體代碼如下:
public T get(Long id) throws Exception {
GetRequest request = new GetRequest(baseIndex, baseType, id+"");
GetResponse response = client.get(request);
Map<String, Object> source = response.getSource();
T t = BeanUtil.map2Bean(source, clazz);
return t;
}
搜索文檔
搜索文檔需要創(chuàng)建SearchRequest對象。
- 設(shè)置搜索的索引:
indices(String... indices)
采蚀,elasticsearch允許對多個索引一起搜索疲牵,所以SearchRequest對象中的indices方法可以設(shè)置多個索引。 - 設(shè)置搜索的文檔類型:
types(String... types)
榆鼠,elasticsearch允許對多個文檔類型一起搜索纲爸,所以SearchRequest對象中的types方法可以設(shè)置多個文檔類型。 - 設(shè)置搜索條件:搜索條件需要封裝在SearchSourceBuilder對象中妆够,我們只需要new SearchSourceBuilder()出該對象出來识啦,然后為該對象設(shè)置搜索條件和數(shù)據(jù)范圍相關(guān)參數(shù)即可。數(shù)據(jù)范圍由from(int from)方法和 size(int size)方法指定神妹。搜索條件由query(QueryBuilder query)方法設(shè)置颓哮。QueryBuilder對象就是最終封裝搜索條件的對象,一個搜索條件就需要創(chuàng)建出一個該對象鸵荠,該對象不需要我們手動創(chuàng)建冕茅,可以從QueryBuilders獲取,QueryBuilders定義了各種搜索匹配的方式蛹找,我們只需要傳入搜索的文檔字段即可姨伤。
- 設(shè)置搜索關(guān)鍵字高亮:當(dāng)我們輸入關(guān)鍵字搜索,如果能搜索出相應(yīng)的文檔庸疾,那一般我們都會在該文檔上乍楚,把匹配到的關(guān)鍵字高亮顯示,設(shè)置高亮顯示的對象為HighlightBuilder届慈,該對象有兩個方法徒溪,preTags()高亮前綴,postTags()高亮后綴拧篮,通過這兩個前綴和后綴词渤,把搜索匹配到的文檔中,出現(xiàn)的搜索關(guān)鍵字的地方包裹起來串绩,實(shí)現(xiàn)高亮的效果。創(chuàng)建出來的HighlightBuilder設(shè)置到SearchSourceBuilder中芜壁。然后SearchSourceBuilder又設(shè)置到SearchRequest對象中礁凡。
- 搜索:調(diào)用高級REST客戶端的search方法,并傳入SearchRequest對象慧妄。
- 返回結(jié)果:返回SearchResponse對象顷牌,調(diào)用該對象的getHits()方法,獲取返回結(jié)果塞淹,并最終轉(zhuǎn)為我們自己的業(yè)務(wù)Page對象窟蓝。
具體代碼如下:
public PageResult search(QueryObject qo) throws Exception {
SearchRequest request = new SearchRequest();
request.indices(baseIndex);
request.types(baseType);
SearchSourceBuilder sourceBuilder = qo.createSearchSourceBuilder();
HighlightBuilder highlightBuilder = qo.createHighlightBuilder();
sourceBuilder.highlighter(highlightBuilder);
request.source(sourceBuilder);
SearchResponse response = client.search(request);
SearchHits searchHits = response.getHits();
long total = searchHits.getTotalHits();
SearchHit[] searchHitArray = searchHits.getHits();
List<T> data = new ArrayList<>();
for(SearchHit hit : searchHitArray){
Map<String, Object> source = hit.getSourceAsMap();
T t = BeanUtil.map2Bean(source, clazz);
qo.setHighlightFields(t,hit);
data.add(t);
}
return new PageResult(data,Integer.parseInt(total+""),qo.getCurrentPage(),qo.getPageSize());
}
想獲取更多技術(shù)干貨,請前往叩丁狼官網(wǎng):http://www.wolfcode.cn/all_article.html