solrconfig.xml 應用解析調優

Eternal發表於2015-03-06

solrconfig.xml配置檔案主要定義了SOLR的一些處理規則,包括索引資料的存放位置,更新,刪除,查詢的一些規則配置。
下面將對solrconfig進行詳細描述:
1 <luceneMatchVersion>4.8</luceneMatchVersion> 表示solr底層使用的是lucene4.8
2 <lib dir="../../../contrib/extraction/lib" regex=".*.jar" /> 表示solr引用包的位置,當dir對應的目錄不存在時候,會忽略此屬性
3 <dataDir>${solr.data.dir:}</dataDir> 定義了索引資料和日誌檔案的存放位置
4 directoryFactory
索引儲存方案,共有以下儲存方案:
1)、solr.StandardDirectoryFactory 這是一個基於檔案系統儲存目錄的工廠,它會試圖選擇最好的實現基於你當前的作業系統和Java虛擬機器版本。
2)、solr.SimpleFSDirectoryFactory 適用於小型應用程式,不支援大資料和多執行緒。
3)、solr.NIOFSDirectoryFactory 適用於多執行緒環境,但是不適用在windows平臺(很慢),是因為JVM還存在bug。
4)、solr.MMapDirectoryFactory 這個是solr3.1到4.0版本在linux64位系統下預設的實現。它是通過使用虛擬記憶體和核心特性呼叫
mmap去訪問儲存在磁碟中的索引檔案。它允許lucene或solr直接訪問I/O快取。如果不需要近實時搜尋功能,使用此工廠是個不錯的方案。
5)、solr.NRTCachingDirectoryFactory 此工廠設計目的是儲存部分索引在記憶體中,從而加快了近實時搜尋的速度。
6)、solr.RAMDirectoryFactory 這是一個記憶體儲存方案,不能持久化儲存,在系統重啟或伺服器crash時資料會丟失。且不支援索引複製

  <directoryFactory name="DirectoryFactory" 
                    class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}">
    <str name="solr.hdfs.home">${solr.hdfs.home:}</str>
    <str name="solr.hdfs.confdir">${solr.hdfs.confdir:}</str>
    <str name="solr.hdfs.blockcache.enabled">${solr.hdfs.blockcache.enabled:true}</str>
    <str name="solr.hdfs.blockcache.global">${solr.hdfs.blockcache.global:true}</str>

  </directoryFactory>

5 <codecFactory class="solr.SchemaCodecFactory"/>
<schemaFactory class="ClassicIndexSchemaFactory"/>
編解碼允許使用自定義的編解碼器。例如:如果想啟動per-field DocValues格式, 可以在solrconfig.xml裡面設定SchemaCodecFactory:
docValuesFormat=”Lucene42″: 這是預設設定,所有資料會被載入到堆記憶體中。
docValuesFormat=”Disk”: 這是另外一個實現,將部分資料儲存在磁碟上。
docValuesFormat=”SimpleText”: 文字格式,非常慢,用於學習。

6 <indexConfig>
用於設定索引的低階別的屬性
1) <filter class="solr.LimitTokenCountFilterFactory" maxTokenCount="10000"/> //限制token最大長度
2) <writeLockTimeout>1000</writeLockTimeout> //IndexWriter等待解鎖的最長時間(毫秒)
3) <maxIndexingThreads>12</maxIndexingThreads> //生成索引時使用的最大執行緒數.
4) <useCompoundFile>false</useCompoundFile>
//solr預設為false。如果為true,索引檔案減少,檢索效能降低,追求平衡。通過將很多 Lucene 內部檔案整合到單一一個檔案來減少使用中的檔案的數量。這可有助於減少 Solr 使用的檔案控制程式碼數目,代價是降低了效能。除非是應用程式用完了檔案控制程式碼
5) <ramBufferSizeMB>100</ramBufferSizeMB> //快取
6) <maxBufferedDocs>1000</maxBufferedDocs> //快取。兩個同時定義時命中較低的那個。在合併記憶體中文件和建立新段之前,定義所需索引的最小文件數。段是用來儲存索引資訊的 Lucene 檔案。較大的值可使索引時間變快但會犧牲較多的記憶體。
7)

`<mergePolicy class="org.apache.lucene.index.TieredMergePolicy">
        <int name="maxMergeAtOnce">20</int>
        <int name="segmentsPerTier">20</int>
        </mergePolicy>`

//合併策略。
8) <mergeFactor>10</mergeFactor> //合併因子,每次合併多少個segments。決定低水平的 Lucene 段被合併的頻率。較小的值(最小為 2)使用的記憶體較少但導致的索引時間也更慢。較大的值可使索引時間變快但會犧牲較多的記憶體。
9) <mergeScheduler class="org.apache.lucene.index.ConcurrentMergeScheduler"/> //合併排程器。
10) <lockType>${solr.lock.type:native}</lockType> //鎖。
11) <unlockOnStartup>false</unlockOnStartup> //unlockOnStartup告知Solr 忽略在多執行緒環境中用來保護索引的鎖定機制。在某些情況下,索引可能會由於不正確的關機或其他錯誤而一直處於鎖定,這就妨礙了新增和更新。將其設定為 true 可以禁用啟動鎖定,進而允許進行新增和更新。
12) <termIndexInterval>128</termIndexInterval> //Lucene loads terms into memory 間隔
13) <reopenReaders>true</reopenReaders> //重新開啟,替代先關閉-再開啟。
14) <deletionPolicy class="solr.SolrDeletionPolicy"> //提交刪除策略,必須實現org.apache.lucene.index.IndexDeletionPolicy
15) <str name="maxCommitsToKeep">1</str> //最多持有提交點的數量
16) <str name="maxOptimizedCommitsToKeep">0</str> //最多持有優化提交點的數量
17) <str name="maxCommitAge">2MINUTES</str> OR <str name="maxCommitAge">1DAY</str><br> //一旦達到指定的時間刪除所有的提交點  
18) <infoStream file="INFOSTREAM.txt">false</infoStream>//相當於把建立索引時的日誌輸出。
<lockType>${solr.lock.type:native}</lockType>
設定索引庫的鎖方式,主要有三種:
⑴.single:適用於只讀的索引庫,即索引庫是定死的,不會再更改
⑵.native:使用本地作業系統的檔案鎖方式,不能用於多個solr服務共用同一個索引庫。Solr3.6 及後期版本使用的預設鎖機制。
⑶.simple:使用簡單的檔案鎖機制
19) <maxMergeDocs> 2147483647 </maxMergeDocs> //控制可由 Solr 合併的 Document 的最大數。較小的值 (< 10,000) 最適合於具有大量更新的應用程式。
20) <maxFieldLength> 10000 </maxFieldLength>
//對於給定的 Document,控制可新增到 Field 的最大條目數,進而截斷該文件。如果文件可能會很大,就需要增加這個數值。然而,若將這個值設定得過高會導致記憶體不足錯誤。
(預設設定 <filter class="solr.LimitTokenCountFilterFactory" maxTokenCount="10000"/>

7 updateHandler節點
<updateLog>
<str name="dir">${solr.ulog.dir:}</str>
</updateLog>
設定索引庫更新日誌,預設路徑為solr home下面的data/tlog。隨著索引庫的頻繁更新,tlog檔案會越來越大,所以建議提交索引時採用硬提交方式,即批量提交。

  `<autoCommit>
   <maxDocs>10000</maxDocs>
   <maxTime>${solr.autoCommit.maxTime:5000}</maxTime>
   <openSearcher>true</openSearcher>
 </autoCommit>`
自動硬提交方式:maxTime:設定多長時間提交一次maxDocs:設定達到多少文件提交一次openSearcher:文件提交後是否開啟新的searcher,
如果false,文件只是提交到index索引庫,搜尋結果中搜不到此次提交的文件;如果true,既提交到index索引庫,也能在搜尋結果中搜到此次提交的內容。

 `<autoSoftCommit>`
   `<maxTime>${solr.autoSoftCommit.maxTime:-1}</maxTime>` 
 `</autoSoftCommit>` //軟提交;
 1、把記憶體檔案fsync到磁碟,但不建立index descriptor。也就是說原索引和現在的索引還互不感知,所以如果jvm崩潰,那這部分索引就沒了。
 2、可以重新開啟searcher,使得新的索引可以被查詢到。

 `<listener event="postCommit" class="solr.RunExecutableListener">`  
    `<str name="exe">solr/bin/snapshooter</str>`   //exe--可執行的檔案型別 
    `<str name="dir">.</str>`//dir--可以用該目錄做為當前的工作目錄。預設為 "." 
    `<bool name="wait">true</bool>`                //wait--呼叫執行緒要等到可執行的返回值 
    `<arr name="args"> <str>arg1</str> <str>arg2</str> </arr>`   //args--傳遞給程式的引數 預設nothing  
    `<arr name="env"> <str>MYVAR=val1</str> </arr>`              //env--環境變數的設定 預設nothing 
 `</listener>`  
 //一個postCommit的事件被觸發當每一個提交之後,    

 PS:自己的一些見解,solr提交索引的方式共有三種,通過solr api去提交的方式效能很差,不建議採用;個人建議還是採用autocommit的自動提交,雖然比較消耗資源,但是能最大限度儲存意外造成的索引丟失的情況;

 更多資訊,請檢視https://lucidworks.com/blog/understanding-transaction-logs-softcommit-and-commit-in-sorlcloud/

8 Query查詢節點
<maxBooleanClauses>1024</maxBooleanClauses>
設定boolean 查詢中,最大條件數。在範圍搜尋或者字首搜尋時,會產生大量的 boolean 條件,
如果條件數達到這個數值時,將丟擲異常,限制這個條件數,可以防止條件過多查詢等待時間過長。
快取方法http://www.cnblogs.com/phinecos/archive/2012/05/24/2517018.html

 `<!-- 過濾器快取 --> 
 <filterCache class="solr.FastLRUCache"
             size="32768"
             initialSize="32768"
             autowarmCount="512"/>`

 `<!-- 查詢結果快取 -->
 <queryResultCache class="solr.FastLRUCache"
             size="8192"
             initialSize="8192"
             autowarmCount="512"/>`

 `<!-- 查詢文件快取 --> 
 <documentCache class="solr.FastLRUCache"
             size="4096"
             initialSize="4096"
             autowarmCount="0"/>`

 `<!-- 自定義快取 --> 
 <cache name="perSegFilter"
             class="solr.search.LRUCache"
             size="4096"
             initialSize="4096"
             autowarmCount="4096"
             regenerator="solr.NoOpRegenerator" />`

 `<!-- 欄位值快取 --> 
 <fieldValueCache class="solr.FastLRUCache"
             size="512"
             autowarmCount="128"
             showItems="32" />`


 1)size:cache中可儲存的最大的項數,預設是1024

 2)initialSize:cache初始化時的大小,預設是1024。

 3)autowarmCount:當切換SolrIndexSearcher時,可以對新生成的SolrIndexSearcher做autowarm(預熱)處理。autowarmCount表示從舊的SolrIndexSearcher中取多少項來在新的SolrIndexSearcher中被重新生成,如何重新生成由CacheRegenerator實現。在當前的1.4版本的Solr中,這個autowarmCount只能取預熱的項數,將來的4.0版本可以指定為已有cache項數的百分比,以便能更好的平衡autowarm的開銷及效果。如果不指定該引數,則表示不做autowarm處理。

 實現上,LRUCache直接使用LinkedHashMap來快取資料,由initialSize來限定cache的大小,淘汰策略也是使用LinkedHashMap的內建的LRU方式,讀寫操作都是對map的全域性鎖,所以併發性效果方面稍差。

 `<enableLazyFieldLoading>true</enableLazyFieldLoading>`   //某些欄位延時載入,以提高效能,例如內容較多的壓縮檔案
 `<queryResultWindowSize>50</queryResultWindowSize>`       //Result Window Size 優化queryResultCache結果cache
 `<queryResultMaxDocsCached>800</queryResultMaxDocsCached>`  //查詢結果文件的最大快取數

 `<!-- 與請求相關的監聽器 -->  
 <!-- QuerySenderListener使用NamedList的陣列和每個序列NamedList的執行一個本地查詢請求。--> 
 <listener event="newSearcher" class="solr.QuerySenderListener">
 <arr name="queries">
       </arr>
 </listener>
 <listener event="firstSearcher" class="solr.QuerySenderListener">
    <arr name="queries">
    <lst>
      <str name="q">static firstSearcher warming in solrconfig.xml</str>
    </lst>
    </arr>
 </listener>
 <useColdSearcher>true</useColdSearcher>`   //使用雲搜尋 
 `<maxWarmingSearchers>8</maxWarmingSearchers>`
 //該引數用於設定最大的 searcher 數量,這些 searcher 實現預熱好的,隨時可以呼叫。如果超過這個數量,將會報錯。在一個只讀的索引庫中,2個預熱的 searcher 是相對合理的,如果是讀寫的索引庫中,根據記憶體和cpu的大小可以給一個相對大一點的值。

9 Request Dispatcher(請求轉發器)
<!-- Request Dispatcher
主要是介紹當有請求訪問SolrCore時SolrDispatchFilter如何處理。
handleSelect是一個以前版本中遺留下來的屬性,會影響請求的對應行為(比如/select?qt=XXX)。
當handleSelect="true"時導致SolrDispatchFilter將請求轉發給qt指定的處理器(前提是/select已經註冊)。
當handleSelect="false"時會直接訪問/select,若/select未註冊則為404。
-->

<requestDispatcher handleSelect="false" >

 `<!-- Request Parsing:請求解析  
 這些設定說明Solr Requests如何被解析,以及對ContentStreams有什麼限制。  
 enableRemoteStreaming - 是否允許使用stream.file和stream.url引數來指定遠端streams。  
 multipartUploadLimitInKB - 指定多檔案上傳時Solr允許的最大的size,設定了通過多部分(multi-part)的HTTP POST請求提交的文件大小的上限,單位是Kb。這個值指定為1024的倍數來確定Bytes的大小
 formdataUploadLimitInKB - 表單通過POST請求傳送的最大size,設定了一個用Kb表示的限制,用以限制HTTP POST請求中提交的表單資料的大小,這個大小可以用來傳遞請求的引數但並不適合(寫入)URL中
 addHttpRequestToContext - 用來宣告原始的HttpServletRequest物件應該被包括在使用httpRequest的SolrQueryRequest的上下文集合(context map)中。
 這個HttpServletRequest不會用於任何Solr的組成部分,但在開發自定義的外掛是會很有用
 -->` 
 `<requestParsers enableRemoteStreaming="true" 
                 multipartUploadLimitInKB="2048000"
                 formdataUploadLimitInKB="20480"
                 addHttpRequestToContext="false"/>`

 `<httpCaching>`元素控制了HTTP快取控制頭(HTTP cache control headers)。不要將這些設定和Solr內部的快取配置混淆。這個元素控制了W3C HTTP規格定義的HTTP響應的快取過程。這個元素允許三個屬性和一個下級元素。
 `<httpCaching>`元素的屬性決定了是否允許對一個GET請求進行304響應,如果可以,它應該是什麼響應類別(sort)。當一個HTTP使用者程式生成一個GET請求,如果資源從上一次被取得後還沒有被修改,那麼它可以可選擇地指定一個可接受的304響應。

 never304
 如果將這個值設定為true,那麼即使請求的資源還沒有被修改,一個GET請求也永遠不會得到一個304響應。如果這個屬性被設定為true,那麼接下來的兩個屬性會被忽略。將這個屬性設定為true對於開發來說是方便的,因為當通過支援快取頭的web瀏覽器或者其他使用者修補Solr的響應時,304響應可能會使人混淆。

 lastModFrom 這個屬性可以設定為openTime(預設值)或者dirLastMod。openTime指示了最後更改時間,相對於客戶傳送的If-Modified-Since頭,
 它應該在搜尋器開始的時候計算。如果當索引在硬碟上更新時你需要精確同步,那麼使用dirLastMod。

 etagSeed
 這個屬性的值被作為ETag頭的值。改變這個值可以有助於強制使用者重新取得內容,即使索引沒有被改變。例如,當你修改了配置的時候。

 `<httpCaching never304="false"
 lastModFrom="openTime"
 etagSeed="Solr">
 <cacheControl>max-age=30, public</cacheControl>
 </httpCaching>`

10 requestHandler(請求處理器)
提供了類似webservice的功能,可以通過http請求solr搜尋
Configuration
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int> //顯示數量-
<str name="df">text</str> //預設搜尋欄位
</lst>

  `<requestHandler name="/query" class="solr.SearchHandler">
   <lst name="defaults">
     <str name="echoParams">explicit</str>
     <str name="wt">json</str>     //顯示格式
     <str name="indent">true</str>
     <str name="df">text</str>
   </lst>
  </requestHandler>`

   這些引數定義了需要返回多少結果(定義值為10),通過引數df定義了搜尋的域預設為“text”域。echoParams引數定義了查詢中的在除錯資訊返回的客戶端請求中的引數。
   另外還要注意在列表中這些預設值定義方法的 變化:當引數是String,integer或其他型別時,定義型別是不同的。

   更多資訊,請檢視https://wiki.apache.org/solr/CoreQueryParameters?action=fullsearch&context=180&value=echoParams&titlesearch=Titles

   所有這些在搜尋部分描述的引數可以在任何SearchHandlers中定義為預設值(這些引數的細節資訊請參考搜尋部分)

   除了這些預設值,還有一些選擇可用於SearchHandler,包括了下面的這些內容:

   appends:這個設定允許在使用者查詢中新增引數的定義。這些引數可能是過濾查詢,或者其他可以被加入每一個查詢的查詢規則。在Solr中沒有機制允許客戶端覆蓋這些新增,所以你應當確定你總是需要在查詢中加入這些引數。

    `<lst name="appends">
     <str name="fq">inStock:true</str>
    </lst>`

   在這個例子中,過濾查詢“inStock:true”會新增到每一個查詢上。

   Invariants:這個設定允許定義不會被客戶端覆蓋的引數。在invariants部分定義的值總是會被使用,而不考慮使用者或客戶端預設的或新增的值。

     `<lst name="invariants">
     <str name="facet.field">cat</str>
     <str name="facet.field">manu_exact</str>
     <str name="facet.query">price:[* TO 500]</str>
     <str name="facet.query">price:[500 TO *]</str>
     </lst>`

   在這個例子中,facet域被定義,這個定義會限制Solr返回的facets。如果客戶端請求facets,那麼他們只會看到和這個配置的相同的facets。

   在request handler最後部分,是元件(component)的定義,它定義了可以被用於一個request

   Handler的搜尋元件的列表。它們僅在request handler中註冊。對搜尋元件的更進一步的討論在搜尋元件部分。搜尋元件元素只能被用於SearchHandler。

   Handler Resolution

   客戶端可以通過帶有“gt”這個引數的“/select/ url”請求,也可以通過在solrconfig.xml配置的方式來決定要訪問的SolrRequestHandler。

   Solr是通過下面的步驟去選擇一個handler並處理請求的.....
   尋找name屬性跟請求中的qt引數匹配的handler
   尋找在配置檔案中“default=true”的handler
   尋找在配置檔案中name屬性為“standad”的handler
   使用StandardRequestHandler的預設例項

   如果你的配置檔案solrconfig.xml 包含有name屬性為"/select", "/update", 或"/admin",那麼你的程式將不會沿用標準的請求處理過程,而將會是你自己自定義的邏輯。

   擴充套件自己的Handler

   實現一個SolrRequestHandler 最簡單的方法是去擴充套件 RequestHandlerBase 類。
   更多資訊,請參考http://wiki.apache.org/solr/SolrRequestHandler#head-3dfff37b7cc549669ba241eb6050ffdbc80d7e78

相關文章