(十五)使用Java操作Elasticsearch

本文作者:羅海鵬煌往,叩丁狼高級講師。原創(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地址在以下鏈接:

https://github.com/luohaipeng/es-java-api

高級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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饱普,一起剝皮案震驚了整個濱河市运挫,隨后出現(xiàn)的幾起案子状共,更是在濱河造成了極大的恐慌,老刑警劉巖谁帕,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峡继,死亡現(xiàn)場離奇詭異,居然都是意外死亡匈挖,警方通過查閱死者的電腦和手機(jī)碾牌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來儡循,“玉大人舶吗,你說我怎么就攤上這事≡裣ィ” “怎么了裤翩?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長调榄。 經(jīng)常有香客問我踊赠,道長,這世上最難降的妖魔是什么每庆? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任筐带,我火速辦了婚禮,結(jié)果婚禮上缤灵,老公的妹妹穿的比我還像新娘伦籍。我一直安慰自己,他們只是感情好腮出,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布帖鸦。 她就那樣靜靜地躺著,像睡著了一般胚嘲。 火紅的嫁衣襯著肌膚如雪作儿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天馋劈,我揣著相機(jī)與錄音攻锰,去河邊找鬼。 笑死妓雾,一個胖子當(dāng)著我的面吹牛娶吞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播械姻,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼妒蛇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绣夺,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吏奸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乐导,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苦丁,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年物臂,在試婚紗的時候發(fā)現(xiàn)自己被綠了旺拉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡棵磷,死狀恐怖蛾狗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仪媒,我是刑警寧澤沉桌,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站算吩,受9級特大地震影響留凭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜偎巢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一蔼夜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧压昼,春花似錦求冷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至但金,卻和暖如春韭山,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背傲绣。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工掠哥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秃诵。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像塞琼,于是被迫代替她去往敵國和親菠净。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言 ??到目前為止,我們一直都是使用RESTful風(fēng)格的 API操作elasticsearch服務(wù)毅往,但是通過我們...
    LuoHaiPeng閱讀 1,354評論 3 9
  • 說明 在明確了ES的基本概念和使用方法后牵咙,我們來學(xué)習(xí)如何使用ES的Java API.本文假設(shè)你已經(jīng)對ES的基本概念...
    epicGeek閱讀 43,598評論 4 44
  • 神話是普遍存在的嗎?神話是真實(shí)的嗎攀唯?神話被看作是故事洁桌,神話故事首先講的是世界的創(chuàng)造,其他的侯嘀,算作傳說或者是民間故事...
    津城燕窩Donna閱讀 358評論 0 0
  • 一直想記下關(guān)于懶蟲的流水賬戒幔,真正開始行動是從看一本小說后吠谢,發(fā)現(xiàn)寫自己的雖事情與想法也是一有趣的事。懶蟲的語句不夠優(yōu)...
    貓十月閱讀 247評論 0 2
  • 事實(shí)上是我們沒辦法像正常異地戀情侶那樣時呈ィ或是偶爾見面工坊,沒能承認(rèn)和證明彼此的存在,尷尬的處在這樣的情感關(guān)系中敢订,面對...