springboot 2.0 + elasticsearch 5.5 + rabbitmq搭建搜索服務(wù)的坑

???????前一陣子準(zhǔn)備為項(xiàng)目搭建一個(gè)簡(jiǎn)單的搜索服務(wù),雖然業(yè)務(wù)數(shù)據(jù)庫(kù)mongodb提供了文本搜索的支持贿条,但是在大量文檔需要通過(guò)關(guān)鍵詞進(jìn)行定位時(shí)斜脂,es明顯更加適合去作為一個(gè)搜索引擎(雖然我們之前大部分使用到了ELK那套分析和可視化的特性)拨齐。Elasticsearch建立在Lucene之上并且支持極其快速的查詢和豐富的查詢語(yǔ)法,偶爾也可以作為一個(gè)輕量級(jí)的NoSQL颠猴。但是對(duì)復(fù)雜查詢和聚合操作的能力并不是很強(qiáng)。
???????本篇不會(huì)提及如何搭建一個(gè)簡(jiǎn)單搜索服務(wù)小染,而是記錄一下大約一周工作時(shí)間內(nèi)遇見(jiàn)的幾個(gè)坑翘瓮。。

???????為什么選擇elasticsearch 5.x?
???????新服務(wù)沒(méi)有任何歷史包袱裤翩,理論上應(yīng)該用最新的6.x资盅,然而spring-data-elasticsearch只支持到的5.x,時(shí)間緊也無(wú)法很好直接封裝一層api踊赠,也是因?yàn)镋LK那套東西之前版本混亂呵扛,無(wú)奈es從2.x直接到了5.x。查詢一下5.x和2.x的差別筐带,簡(jiǎn)單說(shuō)就是磁盤(pán)空間-50%今穿,索引時(shí)間-50%,查詢性能+25%伦籍。
???????由于spring-data-elasticsearch必須升級(jí)到3.0.7蓝晒,導(dǎo)致spring必須升級(jí)到2.x腮出,也直接導(dǎo)致了后面踩到的坑。

  • docker安裝es會(huì)默認(rèn)安裝x-path plugin
    雖然spring-data支持es5.x芝薇,但是功能并不非常完善胚嘲,因此如果安裝了x-path插件,需要引入org.elasticsearch.client:x-pack-transport:5.5.0洛二,版本必須和es版本一致馋劈,并且自己實(shí)現(xiàn)TransportClient,如下
@Component
public class ESconfig {
    @Bean
    public TransportClient transportClient() throws UnknownHostException {
        TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
                .put("cluster.name", "docker-cluster")
                .put("xpack.security.user", "elastic:changeme")
                .build())
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("0.0.0.0"), 9300));
        return client;
    }
}

這也是因?yàn)椴幌朐俚絛ocker里去處理x-path這個(gè)插件而選擇的一個(gè)比較快捷的解決方案灭红,沒(méi)必要的情況下侣滩,暫時(shí)也不用接觸到es本身的一些東西。

  • mq會(huì)保存message的class信息導(dǎo)致deserialized失敗
    一直沒(méi)有提到標(biāo)題中的rabbitmq变擒,因?yàn)橹皇菃渭兊挠盟鳛橐粋€(gè)消息隊(duì)列君珠,當(dāng)數(shù)據(jù)發(fā)生變化時(shí),將消息id丟入mq娇斑,由search服務(wù)這邊的consumer去消費(fèi)策添。
    問(wèn)題就是在消息丟入mq時(shí),封裝成了一個(gè)自己的Object毫缆, 導(dǎo)致使用rabbitTemplate.receiveAndConvert時(shí)失敗唯竹,因?yàn)閙essage會(huì)帶著Object的package信息。無(wú)奈之下苦丁,consumer只能直接獲取queue里的message bytes, 用ObjectMapper.readValue的方法將json形式轉(zhuǎn)換成一個(gè)Object浸颓。

  • gradle配置可以使用-Dloader.main指定啟動(dòng)函數(shù)
    正是因?yàn)橐肓薽q,所以search服務(wù)需要啟動(dòng)一個(gè)consumer旺拉,用的方法是另外實(shí)現(xiàn)一個(gè)不啟動(dòng)Web服務(wù)的Application产上,并且配置一個(gè)SimpleMessageListenerContainer和MessageListenerAdapter如下:

    @Bean
    SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
            MessageListenerAdapter listenerAdapter,
            MQconfig properties) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setQueueNames(properties.getQueueName());
        container.setMessageListener(listenerAdapter);

        return container;
    }

    @Bean
    MessageListenerAdapter listenerAdapter() {
        MessageListenerAdapter listenerAdapter = new MessageListenerAdapter(itemConsumer,
                "consume");
        return listenerAdapter;
    }

問(wèn)題在于gradle配置的時(shí)候,找了很久如何使得build出來(lái)的jar包可以指定-Dloader.main指定啟動(dòng)Application蛾狗,解決方法如下:
在xxx.gradle文件里添加

bootJar {
    manifest {
        attributes 'Main-Class': 'org.springframework.boot.loader.PropertiesLauncher'
    }
}

在springboot 1.5.9的項(xiàng)目里晋涣,需要指定啟動(dòng)Application,需要添加

springBoot{
    layout = "ZIP"
}

查看是否生效的辦法是build以后 直接解壓jar包沉桌,在xxx(項(xiàng)目名)/META-INFO/MANIFEST.MF里查看谢鹊,如果

Main-Class: org.springframework.boot.loader.PropertiesLauncher

則正確,如果

Main-Class: org.springframework.boot.loader.JarLauncher

則依舊會(huì)啟動(dòng)文件里的Start-Class

  • es無(wú)法修改Index的mapping
    由于只是單純使用了es的文本檢索功能留凭,導(dǎo)致實(shí)際應(yīng)用時(shí)有許多搜索結(jié)果不盡如人意的地方佃扼,比如搜索“桌子”, 無(wú)法搜索到 “電腦桌/辦公桌”等xx桌內(nèi)容蔼夜,這樣的情況還有很多松嘶。 因此加入了synonym dictionary,在需要分詞的字段上不使用本身的ik_smart分詞器挎扰,這樣某些字段的mapping需要改為
    // analyzer是自己的分詞器名字
    @Field(type = FieldType.Text, index = true, analyzer = "synonym")
    private String description;

由于es的mapping無(wú)法修改翠订,只能通過(guò)手動(dòng)創(chuàng)建一個(gè)新的mapping巢音,再通過(guò)reIndex方法去backfill數(shù)據(jù)(es5.x自帶了reIndex 的api)。網(wǎng)上有通過(guò)alias的方法尽超,在某些修改場(chǎng)景下官撼,不需要重新啟動(dòng)/部署應(yīng)用就可以平滑的修改mapping,具體可以查詢了解一下似谁。

以上差不多搭建一個(gè)搜索服務(wù)踩到的一些坑傲绣,有幾個(gè)消耗了大量時(shí)間和精力去解決,在此列出來(lái)希望希望有借鑒意義巩踏。之后搜索服務(wù)有優(yōu)化的地方秃诵,還會(huì)繼續(xù)慢慢更新

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市塞琼,隨后出現(xiàn)的幾起案子菠净,更是在濱河造成了極大的恐慌,老刑警劉巖彪杉,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毅往,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡派近,警方通過(guò)查閱死者的電腦和手機(jī)攀唯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)渴丸,“玉大人侯嘀,你說(shuō)我怎么就攤上這事∑坠欤” “怎么了戒幔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)碟嘴。 經(jīng)常有香客問(wèn)我,道長(zhǎng)囊卜,這世上最難降的妖魔是什么娜扇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮栅组,結(jié)果婚禮上雀瓢,老公的妹妹穿的比我還像新娘。我一直安慰自己玉掸,他們只是感情好刃麸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著司浪,像睡著了一般泊业。 火紅的嫁衣襯著肌膚如雪把沼。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天吁伺,我揣著相機(jī)與錄音饮睬,去河邊找鬼。 笑死篮奄,一個(gè)胖子當(dāng)著我的面吹牛捆愁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窟却,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼昼丑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了夸赫?” 一聲冷哼從身側(cè)響起菩帝,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎憔足,沒(méi)想到半個(gè)月后胁附,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滓彰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年控妻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揭绑。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弓候,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出他匪,到底是詐尸還是另有隱情菇存,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布邦蜜,位于F島的核電站依鸥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏悼沈。R本人自食惡果不足惜贱迟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望絮供。 院中可真熱鬧衣吠,春花似錦、人聲如沸壤靶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至忧换,卻和暖如春恬惯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背包雀。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工宿崭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人才写。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓葡兑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親赞草。 傳聞我的和親對(duì)象是個(gè)殘疾皇子讹堤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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