1. 程式人生 > >Solr--02.Solr中Core詳解

Solr--02.Solr中Core詳解

一、Core概述

1、Core概述

在Solr中、每一個Core、代表一個索引庫、裡面包含索引資料及其配置資訊、
Solr中可以擁有多個Core、也就是同進管理多個索契庫、就像mysql中可以有多個數據庫一樣。

2、Core目錄結構

Core中有二個重要目錄:conf和data

conf目錄中有兩個非常重要的配置檔案:schema.xml和solrconfig.xml

二、Core的配置檔案  

1、core.properties

Core的屬性檔案,記錄當前core的名稱、索引位置、配置檔名稱等資訊,也可以不寫

一般要求Core名稱跟Core的資料夾名稱一致!這裡都是Collection1,可以手動修改這個屬性,把Core的名字改成我們喜歡的。

此時重啟Tomcat,可以看到core的名字已經改變!

1.1、新增多個Core

1)在solr目錄下複製collection並重新命名為collection2,作為新的core目錄、如下圖

2)在collection2下建立conf目錄和data目錄,並且建立檔案core.properties,新增屬性:name=collection2

 

3)、重啟Tomcat,訪問管理頁面

2、schema.xml

Schema.xml配置詳解:Solr中會提前對文件中的欄位進行定義,
並且在schema.xml中對這些欄位的屬性進行約束,例如:欄位資料型別、欄位是否索引、是否儲存、是否分詞等

2.1、<field>標籤

<field>標籤:  通過Field欄位 定義欄位的屬性資訊:

語法:

屬性及含義:
		name:欄位名稱
		type:欄位型別,指向的是本檔案中的<fieldType>標籤
		indexed:是否建立索引
		stored:是否被儲存
		multiValued:是否可以有多個值,如果欄位可以有多個值,設定為true,false為單個值。
多個值:對應JSON的陣列格式。 對應java的List格式。

注意:

在本檔案中,有兩個欄位是Solr自帶的欄位,絕對不要刪除:_version節點、_root節點和id節點。

擴充套件:

•omitNorms:是否忽略掉Norm,可以節省記憶體空間,只有全文字field和need an index-time boost的field需要norm。
預設就是true,即忽略標準因子。如果一個域要使用得分激勵因子,必須要手動的設定omitNorm= false,否則會報錯。
•termVectors:當設定true,會儲存 term vector。當使用MoreLikeThis,用來作為相似詞的field應該儲存起來。
•termPositions:儲存 term vector中的地址資訊,會消耗儲存開銷。
•termOffsets:儲存 term vector 的偏移量,會消耗儲存開銷。

2.2、<FieldType>標籤

過FieldType指定資料型別

語法:

name:欄位型別的名稱,可以自定義,<field>標籤的type屬性可以引用該欄位,來指定資料型別
class:欄位型別在Solr中的類。StrField可索引不可分詞。TextField欄位可索引,可以分詞,所以需要指定分詞器
<analyzer>:這個子標籤用來指定分詞器

擴充套件:

precisionStep:
用於數值範圍搜尋,進行分詞 通過設定precisionStep的值可以提高檢索速度,8是solr的推薦值。
設定一個PrecisionStep (預設4),對數值型別每次右移(n-1)* PrecisionStep 位。
每次移位後,從左邊開始每7位存入一個byte,組成一個byte[],
並且在陣列第0位插入一個特殊byte,標識這次的偏移量。
每個byte[]可以轉成一個lexicographic sortable string。
lexicographic sortable string 的字元按字典序排列後,和偏移量,
數值的大小順序是一致的。這個是NumericRangeQuery 範圍查詢的關鍵。

positionIncrementGap:
一個doc中的屬性有多個值時候,設定每個屬性之間的增量值和multiValued屬性配合使用(避免錯誤匹配)。
其作用就是在對Multivalue Field進行處理的時候,給兩個field中相隔的詞人為的插入一段固定的distance
然後在使用Lucene/Solr做Phrase query的時候,如果沒有指定Slop(對slop的介紹,可以參
考:http://blog.csdn.net/rick_123/article/details/6708527),會預設Slop為0,即查詢的短語之間應該緊緊挨著,
這樣對很多情況下都得不到使用者想要的結果。解決的辦法就是使用phrase query,同時設定一個適當的Slop值,

然後為了不讓lucene的搜尋跨越多個Field Value,
設定一個遠大於slop的positionIncrementGap,就可以達到目標。

sortMissingLast:設定成true沒有該field的資料排在有該field的資料之後,而不管請求時的排序規則, 預設是true。
sortMissingFirst:跟sortMissingLast相反。預設是false。

analyzer:欄位型別指定的分詞器。
type:當前分詞器用於分詞的操作。index 代表生成索引時使用的分詞器。query 代表在查詢時使用的分詞器。
tokenizer:分詞器使用具體的分詞器類。

2.3、<uniqueKey>標籤

唯一主鍵
Lucene中本來是沒有主鍵的。刪除和修改都需要根據詞條進行匹配。
而Solr卻可以設定一個欄位為唯一主鍵,這樣增刪改操作都可以根據主鍵來進行!

2.4、<dynamicField>標籤

動態欄位

2.5、引入IK分詞器

(1)、引入依賴、	在schemal.xml中自定義fieldType,引入IK分詞器

(2)、讓欄位使用我們的自定義資料型別,引入IK分詞器

 

2.6、schema.xml簡化

<?xml version="1.0" encoding="UTF-8" ?>

<schema name="example" version="1.5">
    
  <!-- ========================1 不能刪除欄位=========================== -->

   <!-- If you remove this field, you must _also_ disable the update log in solrconfig.xml
      or Solr won't start. _version_ and update log are required for SolrCloud
   --> 
   <field name="_version_" type="long" indexed="true" stored="true"/>
   
   <!-- points to the root document of a block of nested documents. Required for nested
      document support, may be removed otherwise
   -->
   <field name="_root_" type="string" indexed="true" stored="false"/>

   <!-- Only remove the "id" field if you have a very good reason to. While not strictly
     required, it is highly recommended. A <uniqueKey> is present in almost all Solr 
     installations. See the <uniqueKey> declaration below where <uniqueKey> is set to "id".
   -->   
   <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
        
  <!-- Field to use to determine and enforce document uniqueness. 
      Unless this field is marked with required="false", it will be a required field
   -->
  <uniqueKey>id</uniqueKey>

 
 <!-- ===================不能刪除欄位============================ -->  
  

 <!-- =========================2 索引庫業務欄位============================ -->
 
	<field name="title" type="text_ik" indexed="true" stored="true" multiValued="false"/>
	<field name="content" type="text_ik" indexed="true" stored="true"/>
   
    <field name="text" type="text_ik" indexed="true" stored="false" multiValued="false"/>
    <field name="price"  type="float" indexed="true" stored="true"/>  
 <!-- ====================索引庫業務欄位============================= -->
   
  

 
 <!-- =======================3 索引庫業務擴充套件欄位============================= -->
   <dynamicField name="*_s"  type="string"  indexed="true"  stored="true" />
   
   <copyField source="title" dest="text"/>
   <copyField source="content" dest="text"/>
<!-- =====================索引庫業務擴充套件欄位=========================== -->
   


 
 <!-- ======================4 欄位型別定義============================== -->
    
	<!-- IK分詞器 -->
	 <fieldType name="text_ik" class="solr.TextField">
			<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer" />
	</fieldType>
	
    <fieldType name="string" class="solr.StrField" sortMissingLast="true" />

  
    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="double" class="solr.TrieDoubleField" 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" />
			
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>
 <!-- ==========================欄位型別定義======================== -->
     

</schema>

 

3、solrconfig.xml

solrconfig.xml:這個配置檔案主要配置跟索引庫和請求處理相關的配置。solr服務的優化主要通過這個配置檔案進行:

3.1、索引庫的相關配置

<lib/>標籤:

•用途:配置外掛依賴的jar包 
•注意事項:
            o如果引入多個jar包,要注意包和包的依賴關係,被依賴的包配置在前面
            o這裡的jar包目錄如果是相對路徑,那麼是相對於core所在目錄、如下圖

我們發現這些配置是在找兩個資料夾下的jar包:contrib和dist。這兩個資料夾其實在Solr的安裝目錄中有

而<lib dir=””>標籤中的dir是相對目錄,預設相對於core目錄。
我們的core在D:\\test\\solr\\core1位置,我們把這兩個資料夾複製到solr下

然後修改相對路徑,只留下一個 ../  即可

3.2、請求處理相關的配置

  <requestHandler/> 標籤:

•用途:配置Solr處理各種請求(搜尋/select、更新索引/update、等)的各種引數
•主要引數:
            o name:請求型別,例如:select、query、get、update
            o class:處理請求的類
            o initParams:可選。引用<initParams>標籤中的配置
            o <lst name="defaults">:定義各種預設的配置,比如預設的parser、預設返回條數

例子:負責搜尋請求的Handler

這裡有一個預設選項:rows=10 ,就是設定預設查10條資料
<str name=”df”> text</str> 這個是設定預設搜尋的欄位為:text,我們可以設定為title,因為我們沒有text欄位

 <initParams/>標籤:

 

•用途:為一些requestHandlers定義通用的配置,以便在一個地方修改後,所有地方都生效
•主要引數:
        o path:指明該配置應用於哪些請求路徑,多個 的話用逗號分開,可以用萬用字元(*表示一層子路徑,**表示無限層)
        o name:如果不指定path,可以指定一個name,然後在<requestHander>配置中可以引用這個name。

例子: (配置一個預設的df)

<initParams path="/update/**,/query,/select,/tvrh,/elevate,/spell,/browse">    
    <lst name="defaults">     
        <str name="df">_text_</str>    
    </lst>  
</initParams>

<updateHandler/>標籤:

•	用途:定義一些更新索引相關的引數,比如定義commit的時機
•	主要引數:
    o	autoCommit:定義自動commit的觸發條件。如果沒配置這個引數,則每次都必須手動commit
        	maxDocs
        	maxTime(毫秒)
        	openSearcher:autoCommit結束後,是否開啟一個新的searcher讓更改生效。預設為false
    o	autoSoftCommit:定義自動softCommit的觸發條件。相關引數同autoCommit
    o	listener:配置事件監聽器
        	event:監聽哪個事件,比如:event="postCommit", event="postOptimize"
        	class:處理的類,可以是自己的實現類。如果是RunExecutableListener,可以配置下面的引數:
        	exe:可執行檔案,包括Solr Home的相對路徑和檔名
        	dir:工作目錄,預設是“.”
        	wait: 呼叫者是否等待可執行檔案執行結束,預設是true
        	args:傳遞給可執行檔案的引數
        	env:其他所需要的環境變數
    o	updateLog:配置log的儲存路徑、等
        	dir:儲存路徑
        	numRecordsToKeep:一個log儲存的記錄數,預設為100
        	maxNumLogsToKeep:log的數量,預設為10
        	numversionBuckets:追蹤max version的bucket數量(?),預設為65535

配置這些引數要考慮到搜尋的準確度和效能的平衡。
注:commit和softCommit:
•	commit:正式提交、對索引的修改會被儲存到永久儲存中(比如磁碟),會比較耗時
•	softCommit:軟提交,對索引的修改會被立即應用到工作中的索引中,即立即生效,但沒有儲存進磁碟

 <query/>標籤:

•	用途:配置Solr如何處理和返回搜尋的相關引數
•	主要引數:
    o	filterCache:當搜尋帶有“fq”引數時,使用這個配置,它儲存未經過排序的所有文件
        	class:實現類,有三種:solr.search.LRUCache, solr.search.FastLRUCache, solr.search.LFUCache
        	size:最大儲存的記錄數量
        	initialSize:初始數量
        	autowarmCount:新Index Searcher啟動的時候從舊的Index Searcher快取拷貝過來的資料量
    o	queryResultCache:儲存最終的搜尋結果(排序後的、有範圍的文件id)
        	class:實現類,有三種:solr.search.LRUCache, solr.search.FastLRUCache, solr.search.LFUCache
        	size:最大儲存的記錄數量
        	initialSize:初始數量
        	autowarmCount:新Index Searcher啟動的時候從舊的Index Searcher快取拷貝過來的資料量
        	maxRamMB:最大分配的容量(兆)
    o	documentCache:快取Lucene Document物件(就是每個文件的fields)
        	class:實現類,有三種:solr.search.LRUCache, solr.search.FastLRUCache, solr.search.LFUCache
        	size:最大儲存的記錄數量
        	initialSize:初始數量
        	autowarmCount:因為Lucene的內部文件 id 是臨時的,所以這個快取不應該被auto-warm,這個值應該為“0”
    o	cache:配置自定義的快取,通過SolrIndexSearcher類的getCache()方法和name引數呼叫這個快取
        	name:被呼叫時的標識
        	其他引數同上
    o	maxBooleanClauses:BooleanQuery的最大子句數量
    o	enableLazyFieldLoading:沒有知道被請求的field是否懶載入,true/false
    o	useFilterForSortedQuery:如果不是按照score排序,是否從filterCache中獲取資料
    o	queryResultWindowsize:配合queryResultCache使用,快取一個超集。如果搜尋請求第10到19條記錄,
而這個引數是50,那麼會快取0到49條記錄
    o	queryResultMaxDocsCached:queryResultCache快取的最大文件數量
    o	useColdSearcher:但一個新searcher正在warm-up的時候,新請求是使用舊是searcher(true)還是等待新的search(false)
    o	maxWarmingSearchers:定義同時在warm-up的searcher的最大數量
    o	listener:監聽一些事件並指定處理的類,比如在solr啟動時載入一些資料到快取中,相關引數:
        	event:被監聽的事件,比如:firstSearcher是第一個searcher啟動、
            也就是solr啟動的事件,newSearcher是當已經有searcher在執行的時候有新searcher啟動的事件
        	class:處理類
        	name:="queries"就是需要處理的是query
        	lst, name:針對哪些搜尋條件需要處理

擴充套件:

快取的清空策略一共有三種:
LRU(Least Recently Used):最近最少使用
LFU(Leats Frequently Uesd):最不經常使用
FIFO(First in First Out):先進先出

<requestDispatcher/>標籤:

•用途:控制Solr HTTP RequestDispatche r響應請求的方式,比如:是否處理/select url、
是否支援對流的處理、上傳檔案的大小、如何處理帶有cache頭的HTTP請求、等等
•主要引數:
    o handleSelect:true/false,如果是false,則由requestHandler來處理/select請求。
因為現在的requestHandler中/select是標配,所以這裡應該填false
    o requestParsers:
         enableRemoteStreaming:是否接受流格式的內容,預設為ture
         multipartUploadLimitInKB:multi-part POST請求,上傳檔案的大小上限(K)
         formdataUploadLimitInKB:HTTP POST的form data大小上限(K)
         addHttpRequestToContext:原始的HttpServletRequest物件是否應該被包含在
SolrQueryRequest的httpRequest中……一般自定義的外掛使用這個引數……
    o httpCaching:如何處理帶有cache control頭的HTTP請求
         nerver304:如果設為true(開發階段),則就算所請求的內容沒被修改,也不會返回304,並且下面兩個引數會失效
         lastModFrom:最後修改時間的計算方式,openTime:Searcher啟動的時刻;dirLastMod:索引更新的時刻
         etagSeed:HTTP返回的ETag頭內容
         cacheControl:HTTP返回的Cache-Control頭內容

<updateProcessor/>和<updateProcessorChain/>標籤:

•	用途:配置處理update請求的處理器、處理器鏈。如果不配置的話,Solr會使用預設的三個處理器:
    o	LogUpdateProcessorFactory:追蹤和記錄日誌
    o	DistributedUpdateProcessorFactory:分流update請求到不同的node,
比如SolrCloud的情況下把請求分配給一個shard的leader,然後把更新應用到所有replica中
    o	RunUpdateProcessorFactory:呼叫Solr的內部API執行update操作
•	如果需要自定義update處理器:
    o	updateProcessor:
        	class:負責處理的類
        	name:名字,給updateProcessorChain引用是使用
    o	updateProcessorChain:
        	name:自己的名字標記
        	processor:指定updateProcessor的name,多個的話用逗號“,”分開