一文了解Solr框架!為你的春招做好準備!

Hi丶ImViper發表於2020-12-06

Table of Contents generated with DocToc

solr原理

索引

Solr/Lucene採用的是一種反向索引(倒排索引),所謂反向索引:就是從關鍵字到文件的對映過程,儲存這種對映這種資訊的索引稱為反向索引

  • 左邊儲存的是字串序列
  • 右邊是字串的文件(Document)編號連結串列,稱為倒排表(Posting List)

索引建立

一、把原始文件交給分片語件(Tokenizer)

  1. 將文件分成一個一個單獨的單詞
  2. 去除標點符號
  3. 去除停詞(stop word)

二、詞彙單元(Token)傳給語言處理元件(Linguistic Processor)

  1. 變為小寫(Lowercase)。
  2. 將單詞縮減為詞根形式,如”cars”到”car”等。這種操作稱為:stemming。
  3. 將單詞轉變為詞根形式,如”drove”到”drive”等。這種操作稱為:lemmatization

三、 得到的詞(Term)傳遞給索引元件(Indexer)

  1. 利用得到的詞(Term)建立一個字典
  2. 對字典按字母順序排序
  3. 合併相同的詞(Term)成為文件倒排(Posting List)連結串列

搜尋步驟

  1. 對查詢內容進行詞法分析、語法分析、語言處理
  2. 搜尋索引,得到符合語法樹的文件集合
  3. 根據查詢語句與文件的相關性,對結果進行排序

空間搜尋原理

空間搜尋,又名Spatial Search(Spatial Query),基於空間搜尋技術,可以做到:

  1. 對Point(經緯度)和其他的幾何圖形建索引
  2. 根據距離排序
  3. 根據矩形,圓形或者其他的幾何形狀過濾搜尋結果

在Solr中,空間搜尋主要基於GeoHash來實現:

GeoHash演算法

通過GeoHash演算法,可以將經緯度的二維座標變成一個可排序、可比較的的字串編碼。
在編碼中的每個字元代表一個區域,並且前面的字元是後面字元的父區域。其演算法的過程如下:
根據經緯度計算GeoHash二進位制編碼
地球緯度區間是[-90,90], 如某緯度是39.92324,可以通過下面演算法對39.92324進行逼近編碼:

  1. 區間[-90,90]進行二分為[-90,0),[0,90],稱為左右區間,可以確定39.92324屬於右區間[0,90],給標記為1;
  2. 接著將區間[0,90]進行二分為 [0,45),[45,90],可以確定39.92324屬於左區間 [0,45),給標記為0;
  3. 遞迴上述過程39.92324總是屬於某個區間[a,b]。隨著每次迭代區間[a,b]總在縮小,並越來越逼近39.928167;
  4. 如果給定的緯度(39.92324)屬於左區間,則記錄0,如果屬於右區間則記錄1,這樣隨著演算法的進行會產生一個序列1011 1000 1100 0111 1001,序列的長度跟給定的區間劃分次數有關。

同理,地球經度區間是[-180,180],對經度116.3906進行編碼的過程也類似:

相關文章