亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

springboot2.0+elasticsearch5.5+rabbitmq搭建搜索服務的坑

2024-07-14 08:41:13
字體:
來源:轉載
供稿:網友

前一陣子準備為項目搭建一個簡單的搜索服務,雖然業務數據庫mongodb提供了文本搜索的支持,但是在大量文檔需要通過關鍵詞進行定位時,es明顯更加適合去作為一個搜索引擎(雖然我們之前大部分使用到了ELK那套分析和可視化的特性)。Elasticsearch建立在Lucene之上并且支持極其快速的查詢和豐富的查詢語法,偶爾也可以作為一個輕量級的NoSQL。但是對復雜查詢和聚合操作的能力并不是很強。

本篇不會提及如何搭建一個簡單搜索服務,而是記錄一下大約一周工作時間內遇見的幾個坑。。

為什么選擇elasticsearch 5.x?

新服務沒有任何歷史包袱,理論上應該用最新的6.x,然而spring-data-elasticsearch只支持到的5.x,時間緊也無法很好直接封裝一層api,也是因為ELK那套東西之前版本混亂,無奈es從2.x直接到了5.x。查詢一下5.x和2.x的差別,簡單說就是磁盤空間-50%,索引時間-50%,查詢性能+25%。

由于spring-data-elasticsearch必須升級到3.0.7,導致spring必須升級到2.x,也直接導致了后面踩到的坑。

docker安裝es會默認安裝x-path plugin

雖然spring-data支持es5.x,但是功能并不非常完善,因此如果安裝了x-path插件,需要引入org.elasticsearch.client:x-pack-transport:5.5.0,版本必須和es版本一致,并且自己實現TransportClient,如下

@Componentpublic 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; }}

這也是因為不想再到docker里去處理x-path這個插件而選擇的一個比較快捷的解決方案,沒必要的情況下,暫時也不用接觸到es本身的一些東西。

mq會保存message的class信息導致deserialized失敗

一直沒有提到標題中的rabbitmq,因為只是單純的用它作為一個消息隊列,當數據發生變化時,將消息id丟入mq,由search服務這邊的consumer去消費。

問題就是在消息丟入mq時,封裝成了一個自己的Object, 導致使用rabbitTemplate.receiveAndConvert時失敗,因為message會帶著Object的package信息。無奈之下,consumer只能直接獲取queue里的message bytes, 用ObjectMapper.readValue的方法將json形式轉換成一個Object。

gradle配置可以使用-Dloader.main指定啟動函數

正是因為引入了mq,所以search服務需要啟動一個consumer,用的方法是另外實現一個不啟動Web服務的Application,并且配置一個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; }

問題在于gradle配置的時候,找了很久如何使得build出來的jar包可以指定-Dloader.main指定啟動Application,解決方法如下:
在xxx.gradle文件里添加

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

在springboot 1.5.9的項目里,需要指定啟動Application,需要添加

springBoot{ layout = "ZIP"}

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

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

則正確,如果

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

則依舊會啟動文件里的Start-Class

es無法修改Index的mapping

由于只是單純使用了es的文本檢索功能,導致實際應用時有許多搜索結果不盡如人意的地方,比如搜索“桌子”, 無法搜索到 “電腦桌/辦公桌”等xx桌內容,這樣的情況還有很多。 因此加入了synonym dictionary,在需要分詞的字段上不使用本身的ik_smart分詞器,這樣某些字段的mapping需要改為

 // analyzer是自己的分詞器名字 @Field(type = FieldType.Text, index = true, analyzer = "synonym") private String description;

由于es的mapping無法修改,只能通過手動創建一個新的mapping,再通過reIndex方法去backfill數據(es5.x自帶了reIndex 的api)。網上有通過alias的方法,在某些修改場景下,不需要重新啟動/部署應用就可以平滑的修改mapping,具體可以查詢了解一下。

以上差不多搭建一個搜索服務踩到的一些坑,有幾個消耗了大量時間和精力去解決,在此列出來希望希望有借鑒意義。之后搜索服務有優化的地方,還會繼續慢慢更新,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩亚洲欧美成人| 欧美一区亚洲一区| 国产亚洲欧美日韩精品| 欧美一级片久久久久久久| 伊人伊人伊人久久| 精品美女永久免费视频| 日韩有码在线播放| 欧美国产日韩一区二区| 国产精品第一页在线| 亚洲一级片在线看| 热99在线视频| 国产精品欧美激情在线播放| 国产精品久久综合av爱欲tv| 日韩女优人人人人射在线视频| 色综合老司机第九色激情| 在线精品91av| 日韩一区二区三区国产| 亚洲综合视频1区| 亚洲欧美制服中文字幕| 日本精品久久久久影院| 国产69精品99久久久久久宅男| 8x海外华人永久免费日韩内陆视频| 精品夜色国产国偷在线| 国产在线精品一区免费香蕉| 亚洲国产高清自拍| 日韩中文字幕视频| 91系列在线观看| 粗暴蹂躏中文一区二区三区| 亚洲第一精品夜夜躁人人爽| 国产精品久久久久久久美男| 久久综合久久88| 精品国产区一区二区三区在线观看| 久久精品中文字幕电影| 91精品国产91久久久久久不卡| 成人天堂噜噜噜| 国产亚洲激情在线| 亚洲天堂日韩电影| 日本一区二区在线播放| 欧美性受xxxx白人性爽| 日本久久久久久久久| 欧美黑人极品猛少妇色xxxxx| 亚洲综合一区二区不卡| 亚洲精品国偷自产在线99热| 日韩欧美国产中文字幕| 亚洲天堂开心观看| 中文字幕视频在线免费欧美日韩综合在线看| 日韩精品极品毛片系列视频| 国产精品观看在线亚洲人成网| 成人网在线免费观看| 欧美激情视频给我| 亚洲娇小xxxx欧美娇小| 欧美极品少妇与黑人| 欧美激情欧美激情| 亚洲日韩中文字幕在线播放| 日韩视频在线免费观看| 色综合色综合网色综合| 亚洲精品电影在线| 日本精品久久久久影院| 不用播放器成人网| 国产精品一区二区三区成人| 久热精品视频在线免费观看| 欧美日韩中文字幕在线| 久久精视频免费在线久久完整在线看| 亚洲自拍偷拍第一页| www.亚洲一二| 欧美大片在线看| 国产日本欧美一区二区三区在线| 国产成人精品久久亚洲高清不卡| 国产极品jizzhd欧美| 美女性感视频久久久| 在线视频欧美日韩精品| 欧美精品在线视频观看| 一二美女精品欧洲| www.亚洲人.com| 亚洲老头同性xxxxx| 96pao国产成视频永久免费| 欧美视频在线视频| 91精品视频在线播放| 久久噜噜噜精品国产亚洲综合| 午夜精品久久久久久99热软件| 在线精品高清中文字幕| 亚洲精品国产精品国自产在线| 久久理论片午夜琪琪电影网| 日韩欧美一区视频| 欧美日韩中国免费专区在线看| 国产香蕉精品视频一区二区三区| 欧美性猛交99久久久久99按摩| 国产精品高清免费在线观看| 亚洲字幕一区二区| 亚洲人成电影网站色xx| 久久天天躁狠狠躁夜夜爽蜜月| 69av在线视频| 欧美激情一二三| 精品国产一区二区在线| 91老司机精品视频| 久久精品国产亚洲7777| 欧美大片在线看免费观看| 日韩经典第一页| 国产美女精品免费电影| 国产99久久精品一区二区 夜夜躁日日躁| 久久视频在线视频| 国模吧一区二区| 国产亚洲人成a一在线v站| 欧美性生活大片免费观看网址| 亚洲精品黄网在线观看| 日韩成人黄色av| 亚洲国产第一页| 国内精久久久久久久久久人| 国产精品日日摸夜夜添夜夜av| 久久综合久久88| 欧美亚洲成人xxx| 欧美精品18videos性欧| 亚洲一区二区三区在线视频| 亚洲综合中文字幕在线| 国产精品夜间视频香蕉| 久久久精品国产一区二区| 黄网站色欧美视频| 国产精品偷伦免费视频观看的| 2021国产精品视频| 中文字幕在线视频日韩| 这里只有精品在线播放| 日韩福利视频在线观看| 国产精品久久久久国产a级| 国产精品入口日韩视频大尺度| 成人国产在线视频| 性金发美女69hd大尺寸| 久久久伊人日本| 亚洲欧美国产一区二区三区| 久久激情视频免费观看| 国产精品一区二区女厕厕| 日韩欧美国产免费播放| 国内精品久久久久久中文字幕| 成人福利视频在线观看| 亚洲国产精品久久久久秋霞蜜臀| 欧美激情按摩在线| 亚洲欧美在线第一页| 91在线视频九色| 欧美另类老肥妇| 国产精品丝袜白浆摸在线| 亚洲国产精品国自产拍av秋霞| 538国产精品视频一区二区| 91产国在线观看动作片喷水| 精品成人国产在线观看男人呻吟| 国产精品久久久一区| 国产91露脸中文字幕在线| 欧美性猛交xxxx偷拍洗澡| 欧美自拍视频在线| 欧美精品免费在线| 久久久精品国产一区二区| 最近免费中文字幕视频2019| 欧美精品video| 浅井舞香一区二区| 91在线视频成人| 日av在线播放中文不卡| 国产视频精品免费播放| 国产中文日韩欧美| 成人激情av在线| 亚洲国产精品久久久久久| 国产激情999| 欧美国产精品va在线观看| 日本精品一区二区三区在线| 亚洲免费一在线| 精品久久久久久电影| 国产激情999|