天天看點

Solr--02.Solr中Core詳解

一、Core概述

1、Core概述

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

2、Core目錄結構

Core中有二個重要目錄:conf和data
           
Solr--02.Solr中Core詳解
conf目錄中有兩個非常重要的配置檔案:schema.xml和solrconfig.xml
           
Solr--02.Solr中Core詳解

二、Core的配置檔案  

1、core.properties

Core的屬性檔案,記錄目前core的名稱、索引位置、配置檔案名稱等資訊,也可以不寫
           
Solr--02.Solr中Core詳解
一般要求Core名稱跟Core的檔案夾名稱一緻!這裡都是Collection1,可以手動修改這個屬性,把Core的名字改成我們喜歡的。
           
Solr--02.Solr中Core詳解
此時重新開機Tomcat,可以看到core的名字已經改變!
           
Solr--02.Solr中Core詳解

1.1、添加多個Core

1)在solr目錄下複制collection并重新命名為collection2,作為新的core目錄、如下圖
           
Solr--02.Solr中Core詳解
2)在collection2下建立conf目錄和data目錄,并且建立檔案core.properties,添加屬性:name=collection2
           
Solr--02.Solr中Core詳解
3)、重新開機Tomcat,通路管理頁面
           
Solr--02.Solr中Core詳解

2、schema.xml

Schema.xml配置詳解:Solr中會提前對文檔中的字段進行定義,
并且在schema.xml中對這些字段的屬性進行限制,例如:字段資料類型、字段是否索引、是否存儲、是否分詞等
           

2.1、<field>标簽

<field>标簽:  通過Field字段 定義字段的屬性資訊:
           
Solr--02.Solr中Core詳解

文法:

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

注意:

在本檔案中,有兩個字段是Solr自帶的字段,絕對不要删除:_version節點、_root節點和id節點。
           
Solr--02.Solr中Core詳解

擴充:

•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指定資料類型
           
Solr--02.Solr中Core詳解

文法:

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卻可以設定一個字段為唯一主鍵,這樣增删改操作都可以根據主鍵來進行!
           
Solr--02.Solr中Core詳解

2.4、<dynamicField>标簽

動态字段
           
Solr--02.Solr中Core詳解

2.5、引入IK分詞器

(1)、引入依賴、	在schemal.xml中自定義fieldType,引入IK分詞器
           
Solr--02.Solr中Core詳解
(2)、讓字段使用我們的自定義資料類型,引入IK分詞器
           
Solr--02.Solr中Core詳解
Solr--02.Solr中Core詳解

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所在目錄、如下圖
           
Solr--02.Solr中Core詳解
我們發現這些配置是在找兩個檔案夾下的jar包:contrib和dist。這兩個檔案夾其實在Solr的安裝目錄中有
           
Solr--02.Solr中Core詳解
而<lib dir=””>标簽中的dir是相對目錄,預設相對于core目錄。
我們的core在D:\\test\\solr\\core1位置,我們把這兩個檔案夾複制到solr下
           
Solr--02.Solr中Core詳解
然後修改相對路徑,隻留下一個 ../  即可
           
Solr--02.Solr中Core詳解

3.2、請求處理相關的配置

  <requestHandler/> 标簽:

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

例子:負責搜尋請求的Handler

Solr--02.Solr中Core詳解
這裡有一個預設選項:rows=10 ,就是設定預設查10條資料
<str name=”df”> text</str> 這個是設定預設搜尋的字段為:text,我們可以設定為title,因為我們沒有text字段
           
Solr--02.Solr中Core詳解

 <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,多個的話用逗号“,”分開
           

繼續閱讀