1. 程式人生 > >Solr分散式搜尋技術實現分析

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異常,整體的查詢將失敗。

參考文件