成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

springboot2.0+elasticsearch5.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)。

創(chuàng)新互聯(lián)建站提供高防主機(jī)、云服務(wù)器、香港服務(wù)器、德陽(yáng)機(jī)房服務(wù)器托管

本篇不會(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ù)慢慢更新,也希望大家多多支持創(chuàng)新互聯(lián)。

網(wǎng)頁(yè)名稱:springboot2.0+elasticsearch5.5+rabbitmq搭建搜索服務(wù)的坑
文章位置:http://jinyejixie.com/article20/jjpijo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)、App設(shè)計(jì)、域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
钟祥市| 孟连| 江孜县| 巴青县| 奉贤区| 诸暨市| 鄢陵县| 呼和浩特市| 禄劝| 崇文区| 大安市| 临安市| 樟树市| 卢龙县| 静宁县| 平昌县| 开原市| 泾阳县| 信阳市| 务川| 望城县| 溧阳市| 临湘市| 华池县| 龙游县| 罗田县| 革吉县| 隆尧县| 大丰市| 建德市| 宁海县| 潞城市| 繁峙县| 安泽县| 呼伦贝尔市| 揭西县| 嘉义市| 长顺县| 溆浦县| 巴林左旗| 竹山县|