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