欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年06月11日 11:05:17   作者:陶源0111  
這篇文章主要介紹了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,如下

@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如下:

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

 // 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ù)慢慢更新,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中日期格式化YYYY-DD的操作bug

    Java中日期格式化YYYY-DD的操作bug

    這篇文章主要介紹了Java中日期格式化YYYY-DD中遇到的坑,本文給大家分享到腳本之家平臺,需要的朋友可以參考下
    2020-01-01
  • java  實現(xiàn)輸出隨機圖片實例代碼

    java 實現(xiàn)輸出隨機圖片實例代碼

    這篇文章主要介紹了java 實現(xiàn)輸出隨機圖片實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Java中類的初始化和實例化區(qū)別詳解

    Java中類的初始化和實例化區(qū)別詳解

    這篇文章主要介紹了Java中類的初始化和實例化區(qū)別詳解,類的初始化<BR>是完成程序執(zhí)行前的準備工作,類的實例化(實例化對象)是指創(chuàng)建一個對象的過程,需要的朋友可以參考下
    2023-08-08
  • 教你怎么用SpringBoot+Mybati-Plus快速搭建代碼

    教你怎么用SpringBoot+Mybati-Plus快速搭建代碼

    Mybatis自身通過了逆向工程來幫助我們快速生成代碼,但Mybatis-plus卻更加強大,不僅僅可以生成dao,pojo,mapper,還有基本的controller和service層代碼,接下來我們來寫一個簡單的人門案例是看看如何mybatis-plus是怎么實現(xiàn)的,需要的朋友可以參考下
    2021-06-06
  • 講解Java中的基礎(chǔ)類庫和語言包的使用

    講解Java中的基礎(chǔ)類庫和語言包的使用

    這篇文章主要介紹了Java中的基礎(chǔ)類庫和語言包的使用,是Java入門學(xué)習中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • 在SpringBoot項目中實現(xiàn)讀寫分離的流程步驟

    在SpringBoot項目中實現(xiàn)讀寫分離的流程步驟

    SpringBoot作為一種快速開發(fā)框架,廣泛應(yīng)用于Java項目中,在一些大型應(yīng)用中,數(shù)據(jù)庫的讀寫分離是提升性能和擴展性的一種重要手段,本文將介紹如何在SpringBoot項目中優(yōu)雅地實現(xiàn)讀寫分離,并通過適當?shù)拇a插入,詳細展開實現(xiàn)步驟,同時進行拓展和分析
    2023-11-11
  • Java8中常用的日期時間工具類總結(jié)

    Java8中常用的日期時間工具類總結(jié)

    這篇文章主要為大家詳細介紹了Java8中常用的三個日期時間工具類,文中的示例代碼講解詳細,具有一定的學(xué)習價值,感興趣的小伙伴可以了解一下
    2023-07-07
  • java獲取指定開始時間與結(jié)束時間之間的所有日期

    java獲取指定開始時間與結(jié)束時間之間的所有日期

    這篇文章主要為大家詳細介紹了java獲取指定開始時間與結(jié)束時間之間的所有日期,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • springboot?yml配置文件值注入方式

    springboot?yml配置文件值注入方式

    這篇文章主要介紹了springboot?yml配置文件值注入方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Intellij idea 代碼提示忽略字母大小寫和常用快捷鍵及設(shè)置步驟

    Intellij idea 代碼提示忽略字母大小寫和常用快捷鍵及設(shè)置步驟

    這篇文章主要介紹了Intellij idea 代碼提示忽略字母大小寫和常用快捷鍵及設(shè)置步驟,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02

最新評論