solr總結詳解教程
Solr調研總結
開發型別 | 全文檢索相關開發 | |
Solr版本 | 4.2 | |
檔案內容 | 本文介紹solr的功能使用及相關注意事項;主要包括以下內容:環境搭建及除錯;兩個核心配置檔案介紹;維護索引;查詢索引,和在查詢中可以應用的高亮顯示、拼寫檢查、搜尋建議、分組統計、拼音檢索等功能的使用方法。 | |
版本 | 作者/修改人 | 日期 |
V1.0 | gzk | 2013-06-04 |
1. Solr 是什麼?
Solr它是一種開放原始碼的、基於 Lucene Java 的搜尋伺服器,易於加入到 Web 應用程式中。Solr 提供了層面搜尋(就是統計)、命中醒目顯示並且支援多種輸出格式(包括XML/XSLT 和JSON等格式)。它易於安裝和配置,而且附帶了一個基於HTTP 的管理介面。可以使用 Solr 的表現優異的基本搜尋功能,也可以對它進行擴充套件從而滿足企業的需要。Solr的特性包括:
- 高階的全文搜尋功能
- 專為高通量的網路流量進行的優化
- 基於開放介面(XML和HTTP)的標準
- 綜合的HTML管理介面
- 可伸縮性-能夠有效地複製到另外一個Solr搜尋伺服器
- 使用XML配置達到靈活性和適配性
- 可擴充套件的外掛體系
2. Lucene 是什麼?
Lucene是一個基於Java的全文資訊檢索工具包,它不是一個完整的搜尋應用程式,而是為你的應用程式提供索引和搜尋功能。Lucene 目前是 Apache Jakarta(雅加達) 家族中的一個開源專案。也是目前最為流行的基於Java開源全文檢索工具包。目前已經有很多應用程式的搜尋功能是基於 Lucene ,比如Eclipse 幫助系統的搜尋功能。Lucene能夠為文字型別的資料建立索引,所以你只要把你要索引的資料格式轉化的文字格式,Lucene 就能對你的文件進行索引和搜尋。
3. Solr vs Lucene
Solr與Lucene 並不是競爭對立關係,恰恰相反Solr 依存於Lucene,因為Solr底層的核心技術是使用Lucene 來實現的,Solr和Lucene的本質區別有以下三點:搜尋伺服器,企業級和管理。Lucene本質上是搜尋庫,不是獨立的應用程式,而Solr是。Lucene專注於搜尋底層的建設,而Solr專注於企業應用。Lucene不負責支撐搜尋服務所必須的管理,而Solr負責。所以說,一句話概括 Solr: Solr是Lucene面向企業搜尋應用的擴充套件。
Solr與Lucene架構圖:
Solr使用Lucene並且擴充套件了它!
- 一個真正的擁有動態欄位(Dynamic Field)和唯一鍵(Unique Key)的資料模式(Data Schema)
- 對Lucene查詢語言的強大擴充套件!
- 支援對結果進行動態的分組和過濾
- 高階的,可配置的文字分析
- 高度可配置和可擴充套件的快取機制
- 效能優化
- 支援通過XML進行外部配置
- 擁有一個管理介面
- 可監控的日誌
- 支援高速增量式更新(Fast incremental Updates)和快照發布(Snapshot Distribution)
4.搭建並除錯Solr
4.1 安裝虛擬機器
Solr 必須執行在Java1.6 或更高版本的Java 虛擬機器中,執行標準Solr 服務只需要安裝JRE 即可,但如果需要擴充套件功能或編譯原始碼則需要下載JDK 來完成。可以通過下面的地址下載所需JDK 或JRE :
安裝 步驟請參考相應的幫助文件。
4.2下載Solr
本文針對Solr4.2版本進行調研的,下文介紹內容均針對Solr4.2版本,如與Solr 最新版本有出入請以官方網站內容為準。Solr官方網站下載地址:http://lucene.apache.org/solr/
4.3下載並設定Apache Ant
Solr是使用Ant進行管理的原始碼, Ant是一種基於Java的build工具。理論上來說,它有些類似於Maven 或者是 C中的make。下載後解壓出來後,進行環境變數設定。
ANT_HOME:E:\Work\apache-ant\1.9.1 (這裡為你自己解壓縮的目錄) PATH:%ANT_HOME%\bin (這個設定是為了方便在dos環境下操作)
檢視是否安裝成功,在命令列視窗中輸入命令ant,若出現結果:
說明ant安裝成功!因為ant預設執行build.xml檔案,這個檔案需要我們建立。現在就可以進行build Solr原始碼了。在命令列視窗中進入到你的Solr原始碼目錄,輸入ant會出現當前build.xml使用提示資訊。
其它的先不用管它,我們只要針對我們使用的IDE進行build就行了,如果使用eclipse就在命令列輸入:ant eclipse.如果使用IntelliJ IDEA 就在命令列輸入:ant idea。這樣就能進行build了。
黑窗口裡提示這個。。。
失敗。。。為什麼呢,最後我發現是因為下載的ant中少了一個jar就是這apache-ivy(下載地址:http://ant.apache.org/ivy/)這東東名子真怪 ivy是ant管理jar依賴關係的。當第一次bulid時ivy會自動把build中的缺少的依賴進行下載。網速慢的第一次build要好久的。。。
下載一個jar就行把jar放到ant的lib下(E:\Work\apache-ant\1.9.1\lib)這樣再次執行ant 就會成功了。到現在才可以進行Solr的程式碼除錯。
4.4配置並執行Solr程式碼
不管用什麼IDE首選都要設定Solr Home在IDE的JVM引數設定VM arguments寫入 -Dsolr.solr.home=solr/example/solr一般就行了.不行也可以使用絕對路徑.
solr使用StartSolrJetty檔案作為入口檔案進行除錯程式碼,在這裡可以設定伺服器使用的埠和solr的webapps目錄.一般都不用設定,預設的就可以進行除錯.Solr Home也能可在程式碼中設定一樣好用. System.setProperty("solr.solr.home", "E:\\Work\\solr-4.2.0-src-idea\\solr\\example\\solr");
目前是使用自帶的一個example作為solr配置的根目錄,如果你有其他的solr配置目錄,設定之即可。點選run即可,debug也是一樣可以用了。沒有別的問題就應該能運行了.注意servlet 容器使用的埠,如查提示:
FAILED [email protected]:8983: java.net.BindException: Address already in use: JVM_Bind 就說明當前端口占用中.改一下就可以了.如果沒有報錯啟動成功後就可以在瀏覽器中輸入地址: http://localhost:8983/solr/ 就可以看到如下介面
到這裡Solr就成功配置並運行了.要是想跟程式碼除錯在啟動時在這個方法裡點斷點就可以Initializer的initialize()方法如果想從瀏覽器中找斷點除錯就要到SolrDispatchFilter的doFilter方法中點斷點了.
注:IE9在相容模式下有bug,必須設定為非相容模式。
5.Solr基礎
因為 Solr 包裝並擴充套件了Lucene,所以它們使用很多相同的術語。更重要的是,Solr 建立的索引與 Lucene 搜尋引擎庫完全相容。通過對 Solr 進行適當的配置,某些情況下可能需要進行編碼,Solr 可以閱讀和使用構建到其他 Lucene 應用程式中的索引。在 Solr 和 Lucene 中,使用一個或多個 Document 來構建索引。Document 包括一個或多個 Field。Field 包括名稱、內容以及告訴 Solr 如何處理內容的元資料。
例如,Field 可以包含字串、數字、布林值或者日期,也可以包含你想新增的任何型別,只需用在solr的配置檔案中進行相應的配置即可。Field 可以使用大量的選項來描述,這些選項告訴 Solr 在索引和搜尋期間如何處理內容。
現在,檢視一下表 1 中列出的重要屬性的子集:
屬性名稱 | 描述 |
Indexed | Indexed Field 可以進行搜尋和排序。你還可以在 indexed Field 上執行 Solr 分析過程,此過程可修改內容以改進或更改結果。 |
Stored | stored Field 內容儲存在索引中。這對於檢索和醒目顯示內容很有用,但對於實際搜尋則不是必需的。例如,很多應用程式儲存指向內容位置的指標而不是儲存實際的檔案內容。 |
5.1模式配置Schema.xml
schema.xml這個配置檔案可以在你下載solr包的安裝解壓目錄的\solr\example\solr\collection1\conf中找到,它就是solr模式關聯的檔案。開啟這個配置檔案,你會發現有詳細的註釋。模式組織主要分為三個重要配置
5.1.1. types 部分
是一些常見的可重用定義,定義了 Solr(和 Lucene)如何處理 Field。也就是新增到索引中的xml檔案屬性中的型別,如int、text、date等.
<fieldType name="string" class="solr.StrField" sortMissingLast="true"/> <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/> <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/> |
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType> |
引數說明:
屬性 | 描述 |
name | 標識而已 |
class | 和其他屬性決定了這個fieldType的實際行為。 |
sortMissingLast | 設定成true沒有該field的資料排在有該field的資料之後,而不管請求時的排序規則, 預設是設定成false。 |
sortMissingFirst | 跟上面倒過來唄。 預設是設定成false |
analyzer | 欄位型別指定的分詞器 |
type | 當前分詞用用於的操作.index代表生成索引時使用的分詞器query程式碼在查詢時使用的分詞器 |
tokenizer | 分詞器類 |
filter | 分詞後應用的過濾器 過濾器呼叫順序和配置相同. |
5.1.2. fileds
是你新增到索引檔案中出現的屬性名稱,而宣告型別就需要用到上面的types
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false"/> <field name="path" type="text_smartcn" indexed="false" stored="true" multiValued="false" termVector="true" /> <field name="content" type="text_smartcn" indexed="false" stored="true" multiValued="false" termVector="true"/> <field name ="text" type ="text_ik" indexed ="true" stored ="false" multiValued ="true"/> <field name ="pinyin" type ="text_pinyin" indexed ="true" stored ="false" multiValued ="false"/> <field name="_version_" type="long" indexed="true" stored="true"/> |
<dynamicField name="*_i" type="int" indexed="true" stored="true"/> <dynamicField name="*_l" type="long" indexed="true" stored="true"/> <dynamicField name="*_s" type="string" indexed="true" stored="true" /> |
- field: 固定的欄位設定
- dynamicField: 動態的欄位設定,用於後期自定義欄位,*號萬用字元.例如: test_i就是int型別的動態欄位.
還有一個特殊的欄位copyField,一般用於檢索時用的欄位這樣就只對這一個欄位進行索引分詞就行了copyField的dest欄位如果有多個source一定要設定multiValued=true,否則會報錯的
<copyField source="content" dest="pinyin"/> <copyField source="content" dest="text"/> <copyField source="pinyin" dest="text"/> |
欄位屬性說明:
屬性 | 描述 |
name | 欄位型別名 |
class | java類名 |
indexed | 預設true。 說明這個資料應被搜尋和排序,如果資料沒有indexed,則stored應是true。 |
stored | 預設true。說明這個欄位被包含在搜尋結果中是合適的。如果資料沒有stored,則indexed應是true。 |
omitNorms | 欄位的長度不影響得分和在索引時不做boost時,設定它為true。 一般文字欄位不設定為true。 |
termVectors | 如果欄位被用來做more like this 和highlight的特性時應設定為true。 |
compressed | 欄位是壓縮的。這可能導致索引和搜尋變慢,但會減少儲存空間,只有StrField和TextField是可以壓縮,這通常適合欄位的長度超過200個字元。 |
multiValued | 欄位多於一個值的時候,可設定為true。 |
positionIncrementGap | 和multiValued一起使用,設定多個值之間的虛擬空白的數量 |
注意:_version_ 是一個特殊欄位,不能刪除,是記錄當前索引版本號的.
5.1.3. 其他配置
uniqueKey: 唯一鍵,這裡配置的是上面出現的fileds,一般是id、url等不重複的。在更新、刪除的時候可以用到。
defaultSearchField:預設搜尋屬性,如q=solr就是預設的搜尋那個欄位
solrQueryParser:查詢轉換模式,是並且還是或者(AND/OR必須大寫)
5.2. solr配置solrconfig.xml
solrconfig.xml這個配置檔案可以在你下載solr包的安裝解壓目錄的E:\Work\solr-4.2.0-src-idea\solr\example\solr\collection1\conf中找到,這個配置檔案內容有點多,主要內容有:使用的lib配置,包含依賴的jar和Solr的一些外掛;元件資訊配置;索引配置和查詢配置,下面詳細說一下索引配置和查詢配置.
5.2.1索引indexConfig
Solr 效能因素,來了解與各種更改相關的效能權衡。 表 1 概括了可控制 Solr 索引處理的各種因素:
屬性 | 描述 |
useCompoundFile | 通過將很多 Lucene 內部檔案整合到一個檔案來減少使用中的檔案的數量。這可有助於減少 Solr 使用的檔案控制代碼數目,代價是降低了效能。除非是應用程式用完了檔案控制代碼,否則 false 的預設值應該就已經足夠。 |
ramBufferSizeMB | 在新增或刪除文件時,為了減少頻繁的更些索引,Solr會選快取在記憶體中,當記憶體中的檔案大於設定的值,才會更新到索引庫。較大的值可使索引時間變快但會犧牲較多的記憶體。如兩個值同時設定,滿足一個就會進行重新整理索引. |
maxBufferedDocs | |
mergeFactor | 決定低水平的 Lucene 段被合併的頻率。較小的值(最小為 2)使用的記憶體較少但導致的索引時間也更慢。較大的值可使索引時間變快但會犧牲較多的記憶體。 |
maxIndexingThreads | indexWriter生成索引時使用的最大執行緒數 |
unlockOnStartup | unlockOnStartup 告知 Solr 忽略在多執行緒環境中用來保護索引的鎖定機制。在某些情況下,索引可能會由於不正確的關機或其他錯誤而一直處於鎖定,這就妨礙了新增和更新。將其設定為 true 可以禁用啟動鎖定,進而允許進行新增和更新。 |
lockType | single: 在只讀索引或是沒有其它程序修改索引時使用. native: 使用作業系統本地檔案鎖,不能使用多個Solr在同一個JVM中共享一個索引. simple :使用一個文字檔案鎖定索引. |
5.2.2 查詢配置query
屬性 | 描述 |
maxBooleanClauses | 最大的BooleanQuery數量. 當值超出時,丟擲 TooManyClausesException.注意這個是全域性的,如果是多個SolrCore都會使用一個值,每個Core裡設定不一樣的化,會使用最後一個的. |
filterCache | filterCache儲存了無序的lucene document id集合,1.儲存了filter queries(“fq”引數)得到的document id集合結果。2還可用於facet查詢3. 3)如果配置了useFilterForSortedQuery,那麼如果查詢有filter,則使用filterCache。 |
queryResultCache | 快取搜尋結果,一個文件ID列表 |
documentCache | 快取Lucene的Document物件,不會自熱 |
fieldValueCache | 欄位快取使用文件ID進行快速訪問。預設情況下建立fieldValueCache即使這裡沒有配置。 |
enableLazyFieldLoading | 若應用程式預期只會檢索 Document 上少數幾個 Field,那麼可以將屬性設定為 true。延遲載入的一個常見場景大都發生在應用程式返回和顯示一系列搜尋結果的時候,使用者常常會單擊其中的一個來檢視儲存在此索引中的原始文件。初始的顯示常常只需要顯示很短的一段資訊。若考慮到檢索大型 Document 的代價,除非必需,否則就應該避免載入整個文件。 |
queryResultWindowSize | 一次查詢中儲存最多的doc的id數目. |
queryResultMaxDocsCached | 查詢結果doc的最大快取數量, 例如要求每頁顯示10條,這裡設定是20條,也就是說快取裡總會給你多出10條的資料.讓你點示下一頁時很快拿到資料. |
listener | 選項定義 newSearcher 和 firstSearcher 事件,您可以使用這些事件來指定例項化新搜尋程式或第一個搜尋程式時應該執行哪些查詢。如果應用程式期望請求某些特定的查詢,那麼在建立新搜尋程式或第一個搜尋程式時就應該反註釋這些部分並執行適當的查詢。 |
useColdSearcher | 是否使用冷搜尋,為false時使用自熱後的searcher |
maxWarmingSearchers | 最大自熱searcher數量 |
5.3Solr加入中文分詞器
中文分詞在solr裡面是沒有預設開啟的,需要我們自己配置一箇中文分詞器。目前可用的分詞器有smartcn,IK,Jeasy,庖丁。其實主要是兩種,一種是基於中科院ICTCLAS的隱式馬爾科夫HMM演算法的中文分詞器,如smartcn,ictclas4j,優點是分詞準確度高,缺點是不能使用使用者自定義詞庫;另一種是基於最大匹配的分詞器,如IK ,Jeasy,庖丁,優點是可以自定義詞庫,增加新詞,缺點是分出來的垃圾詞較多。各有優缺點看應用場合自己衡量選擇吧。
下面給出兩種