Solr分布式搜索技術實現分析


概述

Solr單機支持的搜索數據量是有一定上限的,這個取決於搜索的復雜程度,服務器的硬件配置與業務的要求等等,所以將搜索功能分布化將是對於大數據搜索的一個必然趨勢。

Solr1.3版本開始,自帶了分布式搜索(Distributed Search)。這個功能使得Solr能夠通過多服務器進行橫行擴展,對數據進行水平拆分,從而支持海量數據的搜索功能。

Solr-3.6.1版本對分布式搜索的支持功能如下:

搜索功能模塊

是否支持分布式搜索

Query component

Y

Facet component

Y

Highlighting component

Y

Spell Check Component

Y

Terms Component

Y

Stats component

Y

Term Vector Component

Y

Debug component

Y

Grouping component

Y

QueryElevationComponent

N

MoreLikeThis

N

Join

N

由於業務功能和時間的緣故,本文將只討論Query component的技術實現邏輯。

注意事項

在使用Solr進行分布式搜索的時候,需要注意以下細節:

  • schema.xml中定義的unique key必須保存在索引中。因為Solr在進行2nd phrase搜索時需要使用這個unique key進行數據一致性的二次確認與獲取搜索要求查詢的字段數據。
  • 分布在不同服務器中的索引文件中包含的unique key不要有重復。因為Solr在進行1st phrase搜索時需要根據這些unique key進行排序與去重,如果unique key有重復,包含相同unique keydoc結果將隨機返回。
  • 搜索結果不要有過多的翻頁。因為Solr的分布式搜索中,會將需要翻頁排序后的總結果全部返回給proxy solr server進行匯總排序,如果翻頁過多,那么對網絡帶寬將會照成一定的壓力。
  • 注意HTTP連接數。因為Solr的分布式搜索中,服務器可能既是search server又是proxy server,一遍等待http請求應答有一遍處理http請求,多台服務器之間就可能會出現死鎖。

分布式搜索邏輯實現

Query component的實現原則為:Multi-phased approach, allowing for inconsistency,具體的實現細節如下:

  1. 客戶端發送搜索請求給Solr集群中的任意一台服務器SP
  2. SP服務器處理分布式查詢請求
    1. Phase One
      1. 構建查詢請求,只獲取查詢Docunique keysort field字段。
      2. 將構建好的請求通過HTTP發送給每一個Solr Shard節點。
      3. 等待Solr Shard節點返回查詢結果。
      4. 根據排序規則,逐個合並Solr Shard節點返回的查詢結果。
    2. Phase Two
      1. 構建查詢請求,根據unique key查詢客戶端查詢的相關字段數據。
      2. 將構建好的請求通過HTTP發送給每一個需要請求的Solr Shard節點。
      3. 等待Solr Shard節點返回查詢結果。
      4. 逐個合並Solr Shard節點返回的查詢結果,構建本次查詢的最終結果。
      5. SP服務器將分布式查詢結果返回給客戶端

注意:當前的版本中,分布式查詢中如果有某一個Shard異常,整體的查詢將失敗。

參考文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM