SpringBoot整合Elasticsearch的Java Rest Client

2020年八月修訂:
SpringBoot 已經(jīng)升級了ES的客戶端阁最,Spring Data Elasticsearch 4.0已經(jīng)使用 Elasticsearch 7.6.2了,若希望使用Spring的ES模板可已自行嘗試.


首先明確一點搭独,SpringBoot自帶的ES模板,不建議使用荸频,建議使用Rest Client留晚。如果業(yè)務(wù)簡單,且無特殊要求毙死,可以使用SpringBoot的模板ElasticsearchRepository來搞定燎潮。這個非常簡單,這里不作介紹扼倘,有需要看最底下的連接

ElasticsearchRepository

  • 優(yōu)點: 簡單确封,SpringBoot無縫對接,配置簡單
  • 缺點: 基于即將廢棄的TransportClient再菊, 不能支持復(fù)雜的業(yè)務(wù)

創(chuàng)建SpringBoot項目

IDEA 創(chuàng)建SpringBoot工程

如果不會創(chuàng)建爪喘,可以參考:http://www.reibang.com/p/2101d176555b
maven 和 gradle都可以,建議使用 JDK使用1.8 因為Elasticsearch 的Java High Level REST Client 對java的版本要求是8纠拔。你們可以去官網(wǎng)查證秉剑。
【參考:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-getting-started-maven.html

添加Rest Client依賴,增加配置

maven工程:

 <!-- 工具類 -->
<dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.8.1</version>
</dependency>

 <!-- Java Low Level REST Client -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <version>6.3.2</version>
</dependency>

 <!-- Java High Level REST Client -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>6.3.2</version>
</dependency>

gradle 工程

dependencies {
    compile 'org.elasticsearch.client:elasticsearch-rest-client:6.3.2'
    compile 'org.elasticsearch.client:elasticsearch-rest-high-level-client:6.3.2'
}

版本號請根據(jù)自己安裝的ES版本酌情選擇稠诲,因為ES5和ES6的API有些差別

編寫單例Rest Low Level Client 和Rest High Level Client的bean

想用Spring 的IOC管理ES的連接客戶端侦鹏,可分下面幾步

  • 配置ES節(jié)點
  • 配置Rest Client
  • 配置Rest High Level Client
  • 使用IOC注入

根據(jù)我從其他網(wǎng)站上查詢的資料诡曙,Rest Client是長連接,而且內(nèi)部有默認(rèn)的線程池管理略水,因此一般無需自定義線程池管理連接价卤。如果不對請指正

基于以上結(jié)論。先把連接點全部配置到配置文件中.(為了省事渊涝,直接一個數(shù)組搞定慎璧,有心的朋友可以注入成list+對象)

  1. 配置節(jié)點
elasticsearch.ip=127.0.0.1:9200,127.0.0.2:9200,127.0.0.3:9200,127.0.0.4:9200,127.0.0.5:9200,127.0.0.6:9200
  1. 編寫Config類,配置Rest Client和Rest High Level Client

請找一個pack跨释,創(chuàng)建ElasticsearchRestClient 類

/**
 * this file to you under the Apache License,
 * version 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at:
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 * Create By @author zing  @date 2018/7/18 17:20
 */
@Slf4j
@Configuration
public class ElasticsearchRestClient {
    private static final int ADDRESS_LENGTH = 2;
    private static final String HTTP_SCHEME = "http";

    /**
     * 使用冒號隔開ip和端口1
     */
    @Value("${elasticsearch.ip}")
    String[] ipAddress;

    @Bean
    public RestClientBuilder restClientBuilder() {
        HttpHost[] hosts = Arrays.stream(ipAddress)
                .map(this::makeHttpHost)
                .filter(Objects::nonNull)
                .toArray(HttpHost[]::new);
        log.debug("hosts:{}", Arrays.toString(hosts));
        return RestClient.builder(hosts);
    }


    @Bean(name = "highLevelClient")
    public RestHighLevelClient highLevelClient(@Autowired RestClientBuilder restClientBuilder) {
        restClientBuilder.setMaxRetryTimeoutMillis(60000);
        return new RestHighLevelClient(restClientBuilder);
    }


    private HttpHost makeHttpHost(String s) {
        assert StringUtils.isNotEmpty(s);
        String[] address = s.split(":");
        if (address.length == ADDRESS_LENGTH) {
            String ip = address[0];
            int port = Integer.parseInt(address[1]);
            return new HttpHost(ip, port, HTTP_SCHEME);
        } else {
            return null;
        }
    }
}

注:@Slf4j注解是lombok的日志注解胸私,可以自行刪除,切換成其他日志方式鳖谈;Stream不會的朋友可以寫成for循環(huán)岁疼,速度大約能快些

業(yè)務(wù)使用

強烈建議從TransportClient遷移到RestClient,因為業(yè)務(wù)壓測發(fā)現(xiàn)TransportClient存在并發(fā)瓶頸蚯姆。
在service里然后使用之前創(chuàng)建的highLevelClient呢五续?
demo如下

@Service
public class XXXServiceImpl implements XXXService {
    @Autowired
    RestHighLevelClient highLevelClient;

    @Override
    public boolean testEsRestClient(){
        SearchRequest searchRequest = new SearchRequest("gdp_tops*");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(QueryBuilders.termQuery("city", "北京市"));
        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        searchRequest.source(sourceBuilder);
        try {
            SearchResponse response = highLevelClient.search(searchRequest);
            Arrays.stream(response.getHits().getHits())
                    .forEach(i -> {
                        System.out.println(i.getIndex());
                        System.out.println(i.getSource());
                        System.out.println(i.getType());
                    });
            System.out.println(response.getHits().totalHits);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }
}

如果你沒有Query DSL的基礎(chǔ),建議先學(xué)習(xí)ES的基本查詢方法龄恋,如果有時間我可能會寫一些疙驾,但是網(wǎng)上已經(jīng)有N多入門教程。

ps:

ES 沒有事務(wù)概念郭毕,ES存儲暫時可以理解成每次請求是原子性的它碎,如果涉及多種數(shù)據(jù)庫操作,如:存完ES再存MySQL显押,且要保證一致性的話扳肛,可以考慮使用消息隊列做失敗補償,如果需要及時返回的存儲乘碑,最好不要同時操作兩種數(shù)據(jù)庫挖息。否則則需要手動控制事務(wù)失敗后的恢復(fù)。相對麻煩很多

RestClient其他詳細(xì)使用方法參考我前面的文章:

Elasticsearch Java Rest Client 上手指南(上)

Elasticsearch Java Rest Client 上手指南(下)

想用自帶SpringBoot光環(huán)的ElasticsearchRepository的可參考:https://juejin.im/post/5aec0b386fb9a07abb23784d

By: Max Zing
轉(zhuǎn)載請注明出處:http://www.reibang.com/p/0b4f5e41405e
如有錯誤兽肤,請不吝指正套腹。謝謝
我的博客:https://micorochio.github.io/

轉(zhuǎn)載請勿使用本文章推廣任何自媒體!請勿追加任何媒體的二維碼资铡!

一口奶到位电禀,我把項目里的代碼抽離做成了Maven版的Sample,https://github.com/xzing/SpringBootElasticsearchSample.git
各位看官喜歡可以點個贊

====
感謝@一納秒的指正笤休,由于項目繁忙尖飞,忘記更新博客的代碼了,文章不是一天寫完的,所以有錯誤的話歡迎指正

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末政基,一起剝皮案震驚了整個濱河市贞铣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沮明,老刑警劉巖咕娄,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異珊擂,居然都是意外死亡,警方通過查閱死者的電腦和手機费变,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門摧扇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挚歧,你說我怎么就攤上這事扛稽。” “怎么了滑负?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵在张,是天一觀的道長。 經(jīng)常有香客問我矮慕,道長帮匾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任痴鳄,我火速辦了婚禮瘟斜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘痪寻。我一直安慰自己螺句,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布橡类。 她就那樣靜靜地躺著蛇尚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪顾画。 梳的紋絲不亂的頭發(fā)上取劫,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音亲雪,去河邊找鬼勇凭。 笑死,一個胖子當(dāng)著我的面吹牛义辕,可吹牛的內(nèi)容都是我干的虾标。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼璧函!你這毒婦竟也來了傀蚌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蘸吓,失蹤者是張志新(化名)和其女友劉穎善炫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體库继,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡箩艺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了宪萄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艺谆。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拜英,靈堂內(nèi)的尸體忽然破棺而出静汤,到底是詐尸還是另有隱情,我是刑警寧澤居凶,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布虫给,位于F島的核電站,受9級特大地震影響侠碧,放射性物質(zhì)發(fā)生泄漏抹估。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一舆床、第九天 我趴在偏房一處隱蔽的房頂上張望棋蚌。 院中可真熱鬧,春花似錦挨队、人聲如沸谷暮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽湿弦。三九已至,卻和暖如春腾夯,著一層夾襖步出監(jiān)牢的瞬間颊埃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工蝶俱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留班利,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓榨呆,卻偏偏與公主長得像罗标,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

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

  • 說明 在明確了ES的基本概念和使用方法后闯割,我們來學(xué)習(xí)如何使用ES的Java API.本文假設(shè)你已經(jīng)對ES的基本概念...
    epicGeek閱讀 43,605評論 4 44
  • 開始看Elasticsearch Java API 的時候彻消,被這段話澆了盆涼水 We plan on deprec...
    MaxZing閱讀 41,413評論 9 19
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)宙拉,斷路器宾尚,智...
    卡卡羅2017閱讀 134,660評論 18 139
  • 1. 安裝: 要求至少Java 8(推薦使用Oracle JDK version 1.8.0_121)并設(shè)置$JA...
    simonsgj閱讀 2,249評論 0 9
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,822評論 6 342