Solr基礎教程之solrconfig.xml(三)
前面介紹過schema.xml的一些配置信息,本章介紹solrconfig.xml的配置,以及怎樣安裝smartcn分詞器和IK分詞器,並介紹主要的查詢語法。
1、 solr配置solrconfig.xml
solrconfig.xml這個配置文件能夠在你下載solr包的安裝解壓文件夾的D:\solr-4.10.4\example\solr\collection1\conf中找到,這個配置文件內容有點多,主要內容有:使用的lib配置,包括依賴的jar和Solr的一些插件;組件信息配置;索引配置和查詢配置,以下具體說一下索引配置和查詢配置.
2、索引indexConfig
Solr 性能因素,來了解與各種更改相關的性能權衡。
表 1 概括了可控制 Solr 索引處理的各種因素:
屬性 | 描寫敘述 |
---|---|
useCompoundFile | 通過將非常多 Lucene 內部文件整合到一個文件來降低使用中的文件的數量。這可有助於降低 Solr 使用的文件句柄數目,代價是降低了性能。除非是應用程序用完了文件句柄。否則 false 的默認值應該就已經足夠。 |
ramBufferSizeMB maxBufferedDocs | 在加入或刪除文檔時,為了降低頻繁的更些索引,Solr會選緩存在內存中,當內存中的文件大於設置的值,才會更新到索引庫。較大的值可使索引時間變快但會犧牲較多的內存。如兩個值同一時候設置,滿足一個就會進行刷新索引. |
mergeFactor | 決定低水平的 Lucene 段被合並的頻率。 較小的值(最小為 2)使用的內存較少但導致的索引時間也更慢。較大的值可使索引時間變快但會犧牲較多的內存。 |
maxIndexingThreads | indexWriter生成索引時使用的最大線程數 |
unlockOnStartup | unlockOnStartup 告知 Solr 忽略在多線程環境中用來保護索引的鎖定機制。在某些情況下,索引可能會由於不對的關機或其他錯誤而一直處於鎖定。這就妨礙了加入和更新。 將其設置為 true 能夠禁用啟動鎖定。進而同意進行加入和更新。 |
lockType | single: 在僅僅讀索引或是沒有其他進程改動索引時使用。native: 使用操作系統本地文件鎖,不能使用多個Solr在同一個JVM中共享一個索引。 simple :使用一個文本文件鎖定索引。 |
3、 查詢配置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數量 |
4、Solr加入中文分詞器
中文分詞在solr裏面是沒有默認開啟的,須要我們自己配置一個中文分詞器。眼下可用的分詞器有smartcn。IK。Jeasy。庖丁。事實上主要是兩種,一種是基於中科院ICTCLAS的隱式馬爾科夫HMM算法的中文分詞器,如smartcn,ictclas4j,長處是分詞精確度高,缺點是不能使用用戶自己定義詞庫。還有一種是基於最大匹配的分詞器,如IK ,Jeasy。庖丁。長處是能夠自己定義詞庫。添加新詞。缺點是分出來的垃圾詞較多。
各有優缺點看應用場合自己衡量選擇吧。
以下給出兩種分詞器的安裝方法,任選其一即可,推薦第一種。由於smartcn就在solr發行包的contrib/analysis-extras/lucene-libs/下,就是lucene-analyzers-smartcn-4.2.0.jar,首選在solrconfig.xml中加一句引用analysis-extras的配置,這樣我們自己加入的分詞器才會引到的solr中.
<lib dir="../../../solr-4.10.4/contrib/analysis-extras/lib" regex=".*\.jar" />
<!-- 這裏我寫的是這個jar包對應當前文件solrconfig.xml的相對路徑 -->
假設不想寫上面這樣的引入,也能夠將該jar包放入solr的WEB-INF\lib以下也能達到相同的效果。
4、 smartcn 分詞器的安裝
首選將發行包的contrib/analysis-extras/lucene-libs/ lucene-analyzers-smartcn-4.2.0.jar拷貝到solr的WEB-INF\lib以下。打開/solr/mycore/conf/scheme.xml,編輯text字段類型例如以下,加入以下代碼到scheme.xml中的對應位置。就是找到fieldType定義的那一段,在以下多加入這一段就好啦
<fieldType name="text_smartcn" class="solr.TextField" positionIncrementGap="0">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>
<filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>
<filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>
</analyzer>
</fieldType>
假設須要檢索某個字段,還須要在scheme.xml以下的field中,加入指定的字段。用text_ smartcn作為type的名字。來完畢中文分詞。如 text要實現中文檢索的話,就要做例如以下的配置:
<field name ="text" type ="text_smartcn" indexed ="true" stored ="false" multiValued ="true"/>
5、 IK 分詞器的安裝
首選要去下載IKAnalyzer的發行包.下載地址: http://ik-analyzer.googlecode.com/files/IK%20Analyzer%202012FF_hf1.zip.
下載後解壓出來文件裏IKAnalyzer.cfg.xml、Stopword.dic放到solr的/WEB-INF/classes文件夾下(沒有就創建classes文件夾),將IKAnalyzer2012FF_u1.jar放到solr的/WEB-INF/lib以下.
IKAnalyzer2012FF_u1.jar 分詞器jar包
IKAnalyzer.cfg.xml 分詞器配置文件
Stopword.dic 分詞器停詞字典,可自己定義加入內容
完畢後就能夠像smartcn一樣的進行配置scheme.xml了.
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
<field name ="text" type ="text_ik" indexed ="true" stored ="false" multiValued ="true"/>
如今來驗證下是否加入成功,首先使用StartSolrJetty來啟動solr服務,啟動過程中假設配置出錯,一般有兩個原因:一是配置的分詞器jar找不到,也就是你沒有復制jar包到\solr\contrib\analysis-extras\lib眼下下;二是分詞器版本號不對導致的分詞器接口API不一樣出的錯,要是這個錯的話就在檢查分詞器的相關文檔,看一下支持的版本號是否一樣.
假設在啟動過程中沒有報錯的話說明配置成功了.我們能夠進入到http://localhost:8983/solr地址進行測試一下剛加入的中文分詞器.在首頁的Core Selector中選擇你配置的Croe後點擊以下的Analysis,在Analyse Fieldname / FieldType裏選擇你剛才設置的字段名稱或是分詞器類型,在Field Value(index)中輸入:中國人,點擊右面的分詞即可了.
6、查詢參數
經常使用
q - 查詢字符串。必須的。
fl - 指定返回那些字段內容,用逗號或空格分隔多個。
start - 返回第一條記錄在完整找到結果中的偏移位置,0開始,一般分頁用。
rows - 指定返回結果最多有多少條記錄。配合start來實現分頁。
sort - 排序,格式:sort=”field name”+”desc|asc”[,”field name”+”desc|asc”]… 。演示樣例:(inStock desc, price asc)表示先 “inStock” 降序, 再 “price” 升序,默認是相關性降序。
wt - (writer type)指定輸出格式,能夠有 xml, json, php, phps, 後面 solr 1.3添加的。要用通知我們,由於默認沒有打開。
fq - (filter query)過慮查詢,作用:在q查詢符合結果中同一時候是fq查詢符合的,比如:q=mm&fq=date_time:[20081001 TO 20091031],找keywordmm。而且date_time是20081001到20091031之間的。官方文檔:http://wiki.apache.org/solr/CommonQueryParameters
不經常使用
q.op - 覆蓋schema.xml的defaultOperator(有空格時用”AND”還是用”OR”操作邏輯),一般默認指定
df - 默認的查詢字段,一般默認指定
qt - (query type)指定那個類型來處理查詢請求,一般不用指定。默認是standard。
其他
indent - 返回的結果是否縮進,默認關閉,用 indent=true|on 開啟,一般調試json,php,phps,ruby輸出才有必要用這個參數。
version - 查詢語法的版本號,建議不使用它,由server指定默認值。
[Solr的檢索運算符]
“:” 指定字段查指定值,如返回全部值*:*
“?”表示單個隨意字符的通配
“*” 表示多個隨意字符的通配(不能在檢索的項開始使用*或者?符號)
“~”表示模糊檢索。如檢索拼寫類似於”roam”的項這樣寫:roam~將找到形如foam和roams的單詞;roam~0.8,檢索返回類似度在0.8以上的記錄。
鄰近檢索。如檢索相隔10個單詞的”apache”和”jakarta”,”jakarta apache”~10
“^”控制相關度檢索,如檢索jakarta apache,同一時候希望去讓”jakarta”的相關度更加好,那麽在其後加上”^”符號和增量值。即jakarta^4 apache
布爾操作符AND、||
布爾操作符OR、&&
布爾操作符NOT、!、-(排除操作符不能單獨與項使用構成查詢)
“+” 存在操作符,要求符號”+”後的項必須在文檔對應的域中存在
( ) 用於構成子查詢
[] 包括範圍檢索。如檢索某時間段記錄。包括頭尾,date:[200707 TO 200710]
{}不包括範圍檢索,如檢索某時間段記錄,不包括頭尾
date:{200707 TO 200710}
” 轉義操作符,特殊字符包括+ - && || ! ( ) { } [ ] ^ ” ~ * ?
: “
Solr基礎教程之solrconfig.xml(三)