2020-03-18 通過spring-boot-2.* + spring-data-elasticsearch 使用 ElasticsearchRestTemplate

如何通過spring-boot-2.* + spring-data-elasticsearch構(gòu)建基于 HighLevelRestClient 的 ElasticsearchRestTemplate阳欲,而不是基于 Transport 的 ElasticsearchTemplate?

1. 網(wǎng)上使用spring-boot + spring-data-elasticsearch 配置的文章佩捞,實(shí)際上都不是 ElasticsearchRestTemplate权纤,而是 ElasticsearchTemplate洒嗤。

幾乎網(wǎng)上所有使用spring-boot + spring-data-elasticsearch 注解配置的文章利朵,無論標(biāo)題是否寫著使用ElasticsearchRestTemplate,配置出來的都是使用 transport 的 ElasticsearchTemplate,而不是使用 HighLevelRestClient 的 ElasticsearchRestTemplate。只有少數(shù)幾篇使用 xml 來配置的文章惧所,配置出來的是 ElasticsearchRestTemplate骤坐。

我們來看看最常見的配法,它實(shí)際上配置出來的是基于 transport 的ElasticsearchTemplate下愈。

ElasticsearchTemplate當(dāng)然可以使用了纽绍。但是,ES 官方從 v6.* 開始就deprecated了這個(gè)接口驰唬,且宣稱從 v8.* 開始顶岸,將不再支持基于 transport 的接口。所以我們暫時(shí)用用還行叫编,新項(xiàng)目還是不要再用了,改為使用基于 rest 接口的 ElasticsearchRestTemplate 比較好霹抛。

首先搓逾,在 application.properties中配置

# 這里要配置你實(shí)際的cluster名字。我用的 ES 官方docker容器杯拐,因此其名字是:
spring.data.elasticsearch.cluster-name=docker-cluster
# 這里配置 ES node 地址霞篡。
spring.data.elasticsearch.cluster-nodes=localhost:9300
spring.data.elasticsearch.repositories.enable=true

注意到配置的地址是 localhost:9300,9300端口根本不是 rest 接口使用的端逼,而是 ES 內(nèi)部節(jié)點(diǎn)之間進(jìn)行管理使用的 tcp 接口朗兵。

  • transport 接口就是使用 9300 端口將自己偽裝成為 cluster 的一個(gè)節(jié)點(diǎn),然后通過管理接口進(jìn)行操作的顶滩。
  • rest 接口使用的是 9200 端口余掖,通過 restful 的http接口進(jìn)行訪問。

然后使用注解@EnableElasticsearchRepositories 來啟用 spring-data-elasticsearch 的自動(dòng)配置

@SpringBootApplication
@ComponentScan(basePackages= {"cn.fredworks"})
@EnableElasticsearchRepositories
public class WebApplicationQbank extends SpringBootServletInitializer {

接下來礁鲁,我們就可以使用 ElasticsearchCrudRepository 或 ElasticsearchTemplate 了盐欺。
這是使用 ElasticsearchCrudRepository 的例子:

@Repository
public interface IQuestionDao extends ElasticsearchCrudRepository<Question, String> {

}

這是使用 ElasticsearchTemplate 的例子:

@RunWith(SpringRunner.class)
@SpringBootTest(classes=WebApplicationQbank.class)
class IQuestionMaintainServiceTest {
    
    @Resource(name = "elasticsearchTemplate")
    private ElasticsearchTemplate esRestTemplate;

這個(gè)注入本身就證明了 上面的配置生成的是 ElasticsearchTemplate 而不是 ElasticsearchRestTemplate,否則這個(gè)注入會(huì)因?yàn)轭愋娃D(zhuǎn)換失敗而報(bào)錯(cuò)仅醇。

2. 一種正確的ElasticsearchRestTemplate配置

實(shí)際上冗美,spring-data的所有自動(dòng)配置,幾乎都使用了類似 @ConditionalOnMissingBean/@ConditionalOnBean 這樣的條件語句析二。spring-data-elasticsearch 自動(dòng)配置 ElasticsearchTemplate 也是這樣粉洼。因此,如果我們自己裝配一個(gè) ElasticsearchRestTemplate 實(shí)例出來叶摄,那么就可以阻止 ElasticsearchTemplate 的生成了属韧。因?yàn)闊o論是 ElasticsearchOperation 還是 ElasticsearchTemplate 還是 ElasticsearchRestTemplate,其生成的bean都叫做 "elasticsearchTemplate"准谚,只能有一個(gè)挫剑。我們可以看看 ElasticsearchDataConfiguration.RestClientConfiguration 的內(nèi)容:

    @Configuration(proxyBeanMethods = false)
    @ConditionalOnClass(RestHighLevelClient.class)
    static class RestClientConfiguration {

        @Bean
        @ConditionalOnMissingBean(value = ElasticsearchOperations.class, name = "elasticsearchTemplate")
        @ConditionalOnBean(RestHighLevelClient.class)
        ElasticsearchRestTemplate elasticsearchTemplate(RestHighLevelClient client, ElasticsearchConverter converter,
                ResultsMapper resultsMapper) {
            return new ElasticsearchRestTemplate(client, converter, resultsMapper);
        }

    }

當(dāng)滿足如下兩個(gè)條件時(shí),才會(huì)生成 ElasticsearchRestTemplate

  • 類路徑中有 RestHighLevelClient
  • 還沒有名字叫做 elasticsearchTemplate 柱衔,且類型為 ElasticsearchOperations.class 的 bean 存在樊破。實(shí)際上愉棱,ElasticsearchTemplate 和 ElasticsearchRestTemplate 都是 ElasticsearchOperation 的實(shí)現(xiàn)。

因?yàn)閟pring-data-elasticsearch 的自動(dòng)配置具有最低的優(yōu)先級(jí)哲戚,我們自己提供的@Configuration 優(yōu)先級(jí)較高奔滑,因此我們提供一個(gè)自己的 @Configuratioin 去構(gòu)建 ElasticsearchRestTemplate。它會(huì)先于spring-data-elasticsearch 自動(dòng)組裝的 ElasticsearchTemplate構(gòu)建顺少。因此朋其,我們可以按照如下步驟來配置:
首先,在 application.properties 中配置訪問端口 9200:

# 這里要配置你實(shí)際的cluster名字脆炎。我用的 ES 官方docker容器梅猿,因此其名字是:
spring.data.elasticsearch.cluster-name=docker-cluster
# 這里配置 ES node 地址,必須是 9200 端口秒裕。
spring.data.elasticsearch.cluster-nodes=localhost:9200
spring.data.elasticsearch.repositories.enable=true

然后袱蚓,實(shí)現(xiàn)配置對象:

@Configuration
public class ElasticsearchConfig {

    /**
     * 使用sprnig-data-elasticsearch 自動(dòng)提供的 RestHighLevelClient等構(gòu)建 ElasticsearchRestTemplate
     * 2020年3月18日 下午3:05:55 xx添加此方法
     * @param client
     * @param converter
     * @param resultsMapper
     * @return
     */
    @Bean
    public ElasticsearchRestTemplate elasticsearchTemplate(RestHighLevelClient client, ElasticsearchConverter converter,
            ResultsMapper resultsMapper) {
        return new ElasticsearchRestTemplate(client, converter, resultsMapper);
    }
}

接下來我們就可以直接使用了:

@RunWith(SpringRunner.class)
@SpringBootTest(classes=WebApplicationQbank.class)
class IQuestionMaintainServiceTest {
    
    @Resource(name = QbankModuleBeanNames.QbankModuleElasticsearchTemplate)
    private ElasticsearchRestTemplate esRestTemplate;
    
    /**
     * 2020年3月12日 上午9:59:44 xx添加此方法
     * @throws java.lang.Exception
     */
    @BeforeEach
    void setUp() throws Exception {
        assertNotNull(this.esRestTemplate);
        assertEquals(ElasticsearchRestTemplate.class, this.esRestTemplate.getClass());
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市几蜻,隨后出現(xiàn)的幾起案子喇潘,更是在濱河造成了極大的恐慌,老刑警劉巖梭稚,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颖低,死亡現(xiàn)場離奇詭異,居然都是意外死亡弧烤,警方通過查閱死者的電腦和手機(jī)忱屑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扼褪,“玉大人想幻,你說我怎么就攤上這事』敖剑” “怎么了脏毯?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長幔崖。 經(jīng)常有香客問我食店,道長,這世上最難降的妖魔是什么赏寇? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任吉嫩,我火速辦了婚禮,結(jié)果婚禮上嗅定,老公的妹妹穿的比我還像新娘自娩。我一直安慰自己,他們只是感情好渠退,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布忙迁。 她就那樣靜靜地躺著脐彩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姊扔。 梳的紋絲不亂的頭發(fā)上惠奸,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音恰梢,去河邊找鬼佛南。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嵌言,可吹牛的內(nèi)容都是我干的嗅回。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼呀页,長吁一口氣:“原來是場噩夢啊……” “哼妈拌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蓬蝶,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猜惋,沒想到半個(gè)月后丸氛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡著摔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年缓窜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谍咆。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡禾锤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出摹察,到底是詐尸還是另有隱情恩掷,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布供嚎,位于F島的核電站黄娘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏克滴。R本人自食惡果不足惜逼争,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望劝赔。 院中可真熱鬧誓焦,春花似錦、人聲如沸着帽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至稿壁,卻和暖如春幽钢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背傅是。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國打工匪燕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喧笔。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓帽驯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親书闸。 傳聞我的和親對象是個(gè)殘疾皇子尼变,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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