1.1 Solr 簡介
1.1.1 什么是lucene?
lucene是一個開放源代碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。
1.1.2 什么是Solr?
Solr是Apache下的一個開源項目,使用Java基於Lucene開發的全文檢索服務;是一個獨立的企業級搜索應用服務器,它對外提供類似於Web-service的API接口。用戶可以通過http請求,向搜索引擎服務器提交一定格式的XML文件,生成索引;也可以通過Http Get操作提出查找請求,並得到XML格式的返回結果。
1.1.3 為什么選擇Solr ?
在大型的SQL數據庫上很難執行高速的查詢有Solr是Apache 下的一個開源項目,使用Java基於Lucene開發的全文檢索服務;是一個獨立的企業級搜索應用服務器,它對外提供類似於Web-service的API接口。用戶可以通過http請求,向搜索引擎服務器提交一定格式的XML文件,生成索引;也可以通過Http Get操作提出查找請求,並得到XML格式的返回結果。
兩點原因:第一點原因來自SQL數據庫在性能上缺乏亮點。基本上,你需要在你的查詢中使用JOIN操作。
第二點原因是文檔的天然數據特性:松散的文本文件,這種查詢都是需要使用LIKE。然而joins和likes都是性能殺手,在目前的數據庫引擎中是不方便的。
所以,很多時候希望找到一種跟SQL完全不同的數據檢索方式:倒排索引。這種數據結構類似與美化過的詞典:
key是單個的term
values是跟term對應的文檔列表
這種數據方式可以幫助在大型的數據庫上面進行高速查詢。
1.2 Solr 關鍵特性
1.基於標准的開放接口:Solr搜索服務器支持通過XML、JSON和HTTP查詢和獲取結果。2.易管理:Solr可以通過HTML頁面管理,Solr配置通過XML完成。
3.可伸縮性:能夠有效地復制到另外一個Solr搜索服務器。
4.靈活的插件體系:新功能能夠以插件的形式方便的添加到Solr服務器上。
5.強大的數據導入功能:數據庫和其他結構化數據源現在都可以導入、映射和轉化。
1.3 Solr 核心組成
SolrHome:SolrHome是Solr運行的主目錄,該目錄可以包含多個solrcore目錄。SolrCore:每個solrcore相互獨立,可以單獨對外提供搜索和索引服務;Solr實例就是一個solrcore目錄,包含運行solr實例的所有配置文件和索引文件
1.4 Solr 倒排索引
正排索引(正向索引):正排表是以文檔的ID為關鍵字,表中記錄文檔中每個字的位置信息,查找時掃描表中每個文檔中字的信息直到找出所有包含查詢關鍵字的文檔。
正排表結構如圖1所示,這種組織方法在建立索引的時候結構比較簡單,建立比較方便且易於維護;因為索引是基於文檔建立的,若是有新的文檔加入,直接為該文檔建立一個新的索引塊,掛接在原來索引文件的后面。若是有文檔刪除,則直接找到該文檔號文檔對應的索引信息,將其直接刪除。但是在查詢的時候需對所有的文檔進行掃描以確保沒有遺漏,這樣就使得檢索時間大大延長,檢索效率低下。
盡管正排表的工作原理非常的簡單,但是由於其檢索效率太低,除非在特定情況下,否則實用性價值不大。
倒排索引(反向索引):倒排表以字或詞為關鍵字進行索引,表中關鍵字所對應的記錄表項記錄了出現這個字或詞的所有文檔,一個表項就是一個字表段,它記錄該文檔的ID和字符在該文檔中出現的位置情況。
由於每個字或詞對應的文檔數量在動態變化,所以倒排表的建立和維護都較為復雜,但是在查詢的時候由於可以一次得到查詢關鍵字所對應的所有文檔,所以效率高於正排表。在全文檢索中,檢索的快速響應是一個最為關鍵的性能,而索引建立由於在后台進行,盡管效率相對低一些,但不會影響整個搜索引擎的效率。 倒排表的結構圖如圖2:
1.4.1 solr索引創建流程
分詞組件Tokenizer
分詞組件(Tokenizer)會做以下幾件事情(這個過程稱為:Tokenize),處理得到的結果是詞匯單元(Token)。
1、將文檔分成一個一個單獨的單詞。
2、去除標點符號。
3、去除停詞(stop word)。
1.4.2 語言處理組件
語言處理組件(linguistic processor)主要是對得到的詞元(Token)做一些語言相關的處理。對於英語,語言處理組件(Linguistic Processor)一般做以下幾點:1、變為小寫(Lowercase)
2、將單詞縮減為詞根形式
3、將單詞轉換為詞根形式
1.4.3 索引組件(Indexer)
1、利用得到的詞(Term)創建一個字典
2、對字段進行排序
3、合並相同的詞和詞出現的文檔
1.5 Solr 寫數據流程
1、源字符串首先經過分詞器處理,包括:拆分詞以及去除stopword。
2、然后經過語言處理,包括大小寫轉換以及單詞轉換
3、將源數據中需要的信息加入到Document中的各個Field字段中,並把需要索引的Field字段索引起來,同時把需要存儲的Field字段存儲起來。然后將索引寫入存儲器,存儲器可以是內存或者磁盤。
1.6 Solr 讀數據流程
1、用戶提供搜索關鍵詞,也就是搜索語句,需要經過分詞器處理以及語言處理2、對處理之后的關鍵詞,搜索索引找出對應Document 即記錄
3、用戶根據需要從找到的Document中提取需要的Field字段
