激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - springboot2.0+elasticsearch5.5+rabbitmq搭建搜索服務(wù)的坑

springboot2.0+elasticsearch5.5+rabbitmq搭建搜索服務(wù)的坑

2021-05-08 11:24陶源0111 Java教程

這篇文章主要介紹了springboot2.0+elasticsearch5.5+rabbitmq搭建搜索服務(wù)的坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

為什么選擇elasticsearch 5.x?

新服務(wù)沒有任何歷史包袱,理論上應(yīng)該用最新的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,導(dǎo)致spring必須升級到2.x,也直接導(dǎo)致了后面踩到的坑。

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
@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;
 }
}

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

mq會保存message的class信息導(dǎo)致deserialized失敗

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

問題就是在消息丟入mq時,封裝成了一個自己的object, 導(dǎo)致使用rabbittemplate.receiveandconvert時失敗,因為message會帶著object的package信息。無奈之下,consumer只能直接獲取queue里的message bytes, 用objectmapper.readvalue的方法將json形式轉(zhuǎn)換成一個object。

gradle配置可以使用-dloader.main指定啟動函數(shù)

正是因為引入了mq,所以search服務(wù)需要啟動一個consumer,用的方法是另外實現(xiàn)一個不啟動web服務(wù)的application,并且配置一個simplemessagelistenercontainer和messagelisteneradapter如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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文件里添加

?
1
2
3
4
5
bootjar {
 manifest {
  attributes 'main-class': 'org.springframework.boot.loader.propertieslauncher'
 }
}

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

?
1
2
3
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的文本檢索功能,導(dǎo)致實際應(yīng)用時有許多搜索結(jié)果不盡如人意的地方,比如搜索“桌子”, 無法搜索到 “電腦桌/辦公桌”等xx桌內(nèi)容,這樣的情況還有很多。 因此加入了synonym dictionary,在需要分詞的字段上不使用本身的ik_smart分詞器,這樣某些字段的mapping需要改為

?
1
2
3
// analyzer是自己的分詞器名字
@field(type = fieldtype.text, index = true, analyzer = "synonym")
private string description;

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

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

原文鏈接:https://www.jianshu.com/p/9c60ed244878

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 92精品国产自产在线 | 黄色视品| 午夜a狂野欧美一区二区 | 国产一级www | av电影在线观看网址 | 亚洲91网| 欧美有码在线观看 | 手机免费看一级片 | av最新在线观看 | 一区二区三区四区高清视频 | 精品国产第一区二区三区 | 极品国产91在线网站 | 91精品国产网站 | 国产电影精品 | 视频一区二区在线播放 | 久久影院在线观看 | 毛片在哪看 | 一级黄色大片在线观看 | www久久艹| 免费淫视频 | 黄色99视频 | 色人阁在线视频 | 国内xxxx乱子另类 | 日日爱夜夜操 | 在线成人免费视频 | 黄色大片在线免费观看 | 国内精品久久久久久久影视红豆 | 久久国产精品成人免费网站 | 性生大片免费观看一片黄动漫 | 91av资源在线| 精品一区久久久 | 伊人在线视频 | 一区二区三区在线观看av | 国产合集91合集久久日 | 免费一级片网站 | 毛片电影网址 | 国产精品免费观在线 | av噜噜在线| 龙床上的呻吟高h | 在线播放中文 | 日韩字幕 |