1. 程式人生 > >Apache Solr7.4 入門教程(二)

Apache Solr7.4 入門教程(二)

四、建立core例項

1. core簡介

簡單說core就是solr的一個例項,一個solr服務下可以有多個core,每個core下都有自己的索引庫和與之相應的配置檔案,所以在操作solr建立索引之前要建立一個core,因為索引都存在core下面。

2. core建立

core的建立方式,我列出兩種比較方便的。

(1). 以管理進入cmd, 在$SOLR_HOME/bin目錄下執行solr create –c <name>,建立一個core執行完後,會在$SOLR_HOME/server/solr 下建立一個 eden_core資料夾。 

(2).在AdminUI頁面建立一個core。 

這種需要你提前,準備好 $索引庫名/conf/solrconfig.xml,$索引庫名/conf/lang/下的一些檔案,不然會報如下一系列錯誤, 所以,我們需要從$SOLR_HOME/solr/configsets/sample_techproducts_configs/conf/ 下拷貝以下檔案:

lang/ 下所有檔案
managed-schema
solrconfig.xml
synonyms.txt
stopwords.txt
protwords.txt
params.json

五、managed-schema(schema.xml)

1. schema簡介:

schema是用來告訴solr如何建立索引的,他的配置圍繞著一個schema配置檔案,這個配置檔案決定著solr如何建立索引,每個欄位的資料型別,分詞方式等,老版本的schema配置檔案的名字叫做schema.xml他的配置方式就是手工編輯,但是現在新版本的schema配置檔案的名字叫做managed-schema,他的配置方式不再是用手工編輯而是使用schemaAPI來配置,官方給出的解釋是使用schemaAPI修改managed-schema內容後不需要重新載入core或者重啟solr更適合在生產環境下維護,如果使用手工編輯的方式更改配置不進行重載入core有可能會造成配置丟失,配置檔案所在的路徑如下:$SOLR_HOME/server/solr/eden_core/conf/managed-schema 

2. schema 主要成員

<schema>
    <field/>
    <dynamicField/>
    <uniqueKey/>
    <fieldType>
        <analyzer>
            <tokenizer/>
            <filter/>
        </analyzer>
    </fieldType/>
    <copyField/>
    <dynamicField>
</schema>

2.1 field
屬性    預設值    說明
name        必須,不能取名score,前後輟為下劃線的名字(如:_VERSION_)為保留名字
type        必須,值為定義的<fieldType>
indexed    true    是否進行索引。 true的時候進行索引
stored    true    是否儲存。如果此欄位的值需要顯示在搜尋結果中,則需要進行儲存。
docValues    false    是否需要儲存docValues。true為設定。docValues用於提升sorting, faceting, grouping, function queries等效能,現在僅支援StrField, UUIDFiel和所有的Trie*Field,此值為true的欄位要求此欄位multiValued=false,並且 (required=true或設定了default的值).
multiValued    false    是否有多個值
omitNorms        如果你的大部分的document的長度大小都差不多,則設定成true。如果此欄位在索引時需要boost,則設定為false.
termVectors    false    設定為true,使More Like This特性生效,會極大的增加索引檔案的大小
termPositions    false    通常用於提高高亮搜尋結果這一功能的效能。設定為true,會增加索引檔案的大小
termOffsets    fasle    通常用於提高高亮搜尋結果這一功能的效能。設定為true,會增加索引檔案的大小
termPayloads    fasle    通常用於提高高亮搜尋結果這一功能的效能。設定為true,會增加索引檔案的大小
required    fasle    如果設定為true,則索引時,如果此欄位值為null,則會報錯
default        此欄位是預設欄位
sortMissingFirst
sortMissingLast    false    需要對搜尋結果根據某個欄位排序時,如果某條記錄的此欄位值為空,則該記錄是排在搜尋結果的最前/最後
omitTermFreqAndPositions        對所有不是文字型別的欄位,預設為TRUE
omitPositions        與omitTermFreqAndPositions相似,只是僅忽略位置資訊
useDocValuesAsStored        當docValues=true時,設定此值為TRUE,則如果返回的欄位列表使用了萬用字元,即使此欄位設定了stored=false,此欄位還是會出現在返回的結果裡,
large    false    設定為TRUE時,需要設定stored=true和multiValued=false, 表示此欄位是大欄位,會被懶載入。通常用於此欄位的內容可能比較大,不需要載入記憶體
說明:

omitNorms: 
norm是基於document length norm,document boost和field boost計算出的浮點(float)值。這裡的boost可以理解為權重。document length norm用於為較小的document增加權重(權重較大的話,計算搜尋結果的score值會更高一點)。也就是說如果有一個比較小的document和一個比較長的document都符合搜尋條件,Lucene會認為那個較小的document相對於較長的document更新符合搜尋條件。omitNorms是指忽略norm,所以設為false時,較小的document和較長的document有相同的權重。因此如果我們需要為某個欄位在索引時進行加權(boost),則應該設定為false。當欄位型別為基本型別(比如:int, float,date,bool. string)時此預設值是true。 
termVectors, termPositions, termOffsets 和 termPayloads:
此四個屬性通常用於 hl.useFastVectorHighlighter為true時的情況,會較大地增加索引大小。 
omitTermFreqAndPositions:
如果為TRUE,索引時將忽略頻率、位置、負載等資訊,這有助於提升不需要這些資訊的欄位的效能,也會減少索引大小。但是查詢如果依賴於欄位的位置資訊,則會導致查詢不到相關document。

2.2 dynamicField
為滿足前輟或後輟的一些欄位提供統一的定義。如<dynamicField name="*_s" index="true" stored="true" type="string" /> 表示所有以“_s”為後輟的field都具有index="true" stored="true" type="string"這些屬性。dynamicField通常用於以下情形:

2.2.1 document模型具有較多的欄位
舉個粟子:想要索引pdf檔案,Solr提供了一個簡單的requestHandler – /update/extract,最終會呼叫apache的另外一個開源專案Tika去解析pdf檔案,Solr返回的解析後的document裡包含了很多field,我們只想要其中的某些field,如果我們在<field>裡只配置了我們想要的field,那麼進行索引的時候會報錯,錯誤訊息大體為沒有定義什麼什麼field,這時,我們可以配置一個<dynamicField name="ignore_*" type="ignored" multiValued="true">,然後在solrconfig.xml裡相應的requestHandler裡配置<str name="uprefix">ignore_</str>,這樣對於在managed-schema裡沒定義的field都會被忽略掉。

2.2.2 支援來自不同來源的文件
比如索引的時候想要增加標註其來源的field,可以進行如下的配置:

<field name="source1_field1" type="string" index="true" stored="true" />
<field name="source1_field2" type="string" index="true" stored="true" />
<field name="source1_field3" type="string" index="true" stored="true" />

<field name="source2_field1" type="string" index="true" stored="true" />
<field name="source2_field2" type="string" index="true" stored="true" />
<field name="source2_field3" type="string" index="true" stored="true" />

但是如果有很多來源的話,這種配置就太多了。我們只須配置<dynamicField name="*_s" index="true" stored="true" type="string" />,然後索引的時候改成:

<doc>
    <field name="id">hello</field>
    <field name="source1_field1_s">hello</field>
</doc>

這樣,索引時的field名既可以保留來源的資訊,又不需要在配置檔案裡配置很多的field定義。

2.2.3 增加新的文件來源
還是上面的例子,如果將來有新的文件來源,我們可以不必在配置檔案裡增加諸如 <field name="source5_field1" type="string" index="true" stored="true" />這樣的配置,就可以直接在索引的時候新增“source5_field1_s”這樣的欄位。

2.3 uniqueKey
一般情況下需要配置<uniqueKey>id</uniqueKey>,雖然目錄不是必須的,但是強烈建議設定此值。就好像資料庫設計時,雖然不強制每個表有主鍵,但是一般情況下還是會設定一個主鍵的。

2.4 copyField
用百度或google搜尋時,我們可能想要搜尋一個人名,或者書名,或者網站的名字,其後臺索引檔案裡分別由不同的field去儲存那些值,那它是如何用一個輸入框去搜索不同的field的內容的呢?答案就是<copyField> (不知道百度或google用的是什麼搜尋技術,但是原理應該差不多)

<field name="text" type="string" index="true" stored="true" multiValues="true" />
<copyField source="man_name" dest="text" />
<copyField source="book_name" dest="text" />
<copyField source="web_address" dest="text" />

這樣我們就只需要搜尋text裡的內容就可以了。

2.5 fieldType
fieldType主要定義了一些欄位型別,其name屬性值用於前面中的type屬性的值。e.g. <fieldType name="string" class="solr.StrField" sortMissingLast="true" /> 其中class屬性中solr是org.apache.solr.schema這個包名的縮寫。 
fieldType的屬性: 
1)name 由字母、數字和下劃線組成。不能以數字開頭。此值用於前面中的type屬性的值。 
2)class 此值表明索引並存儲此fieldType的資料的型別(e.g char,int,date…)。如果此類不是solr提供的(自定義的或第三方的類),則不能用”solr.”,需要寫類的全路徑名。 
3)positionIncrementGap 值為整數,用於multiValued=”true”的欄位,指定多個值之間的距離,以防出現假的短語匹配。
比如描述書本作者的欄位是有多個值的,假設有兩個作者:John Smith 和 Mike Jackson,我們搜尋”Smith Mike”這個作者,如果positionIncrementGap值設成0,則此記錄就會被認為是匹配搜尋條件的,實際上是不匹配的。對於這種情況,我們應該把此值設定成一個較大的值,比如100。 
4) autoGeneratePhaseQueries 值為布林型別。預設值為false。對於文字欄位,如果設定為TRUE的話,Solr自動為相鄰的terms生成短語查詢。如果為FALSE,包含在雙引號內的terms才會被認為是短語。
舉個粟子:索引中的文字內容為: * 日圖三餐,夜圖一宿 。 我們在搜尋的輸入框裡輸入日圖,如果autoGeneratePhaseQueries 為true,我們加上highlight的話,返回的匹配結果為: 日圖三餐,夜圖一宿 *。 如果值為false,則返回結果為 日圖三餐,夜圖一宿。如果值為false,我們還是想要進行短語查詢,可在輸入框裡輸入”春花”(注意需要加上兩個雙引號)。 
5)docValuesFormat 自定義docValues的格式。設定此值的話,必須在solrconfig.xml裡配置schema-aware codec。如:<codecFactory class="solr.SchemaCodecFactory" /> 在網上搜了一下,只看到有兩個值 Memory 和 Disk。猜想這個屬性的作用應該是定義docValues值是存在硬碟上還是存在記憶體中吧。 
6)postingsFormat 自定義PostingsFormat。設定此值的話,必須在solrconfig.xml裡配置schema-aware codec。不太清楚具體有什麼用。 
注:儘量不要使用docValuesFormat和postingFormat。Solr的guideline上有一段話,翻譯如下:

僅當使用預設的codec 時,Lucene索引才支援向後相容。因此,如果使用了這兩個屬性,那麼將來想要升級到更高版本的Solr 時,需要你切換回預設的codec,然後優化現有的索引或者重新建立整個索引。

以下的屬性也同時存在於<field>裡,如果<field>裡的值會覆蓋<fieldType>裡的值。 
7)indexed 布林值。true表示進行索引。 
8)stored 布林值。true表示進行儲存。 
9)docValues 布林值。true表示field的值將會被儲存於面向列的資料結構中。 
10)sortMissingFirst 布林值。true表示排序的時候,此field值為空的記錄排在此field值不為空的記錄的前面。 
11)sortMissingLast 布林值 。意思和sortMissingFirst相反。 
12)multiValues 布林值。 
13)omitNorms 布林值。 
14)omitTermFreqAndPositions 布林值。忽略term frequency, positions 和 payloads。所有非文字型別欄位,此預設值是true。 
15)omitPositions 布林值。布林值。忽略positions。 
16)termVectors, termPositions, termOffsets 和 termPayloads 布林值。 
17)required 布林值。 
18)useDocValuesAsStored 布林值。 
19)large 布林值。預設FALSE 
fieldType裡class屬性的一些值: 
1)BinaryField 二進位制資料 
2)BoolField 布林值資料。以”1”、”T”和”t”開頭的字元都被認為是true,其它都是false 
3)CollationField 參見 CollationField 
4)CurrencyField 支援貨幣及匯率。 
5)DateRangeField 日期 
6)ExternalFileField 從硬碟上的某個檔案獲取值 
7)EnumField 允許定義一組列舉值,用於對不能根據字母或數值排序的欄位進行排序。 

<fieldType name="priorityLevel" class="solr.EnumField" enumsConfig="enumsConfig.xml" enumName="priority" /> 

enumsConfig的值是列舉值的配置檔案。enumsConfig.xml 示例:

<?xml version="1.0" ?>
<enumsConfig>
    <enum name="priority"><!-- 上面<fieldType> 裡的enumName的值 -->
        <value>Low</value>
        <value>Medium</value>
        <value>High</value>
    </enum>
    <enum name="risk"> ... 其它一些列舉名及其值列表  ...</enum>
</enumsConfig>

8)ICUCollationField 參見 ICUCollationField 
9)LatLonPointSpatialField 經緯度。用於空間搜尋。通常表示為”lat,lon” 
10)PointType 單值多維度點值。個人理解是指座標值,比如二維或二維座標。 
11)PreAnalyzedField 參見 PreAnalyzedField 
12)RandomSortField 不包含值。在此型別的欄位上排序,將會返回隨機的排序結果。 
13)SpatialRecursivePrefixTreeFieldType 接受”latitue,logitude”格式的字串或WKT格式。完全不明白是啥。 
14)StrField UTF-8或Unicode的字串。用於較小的欄位,並且不被切分或分析(個人理解:此欄位的值不會被拆分,被做為一個整體進行索引)。限制小於32K 
15)TextField 
16)TrieDateField, TrieDoubleField, TrieFloatField, TrieIntField, TrieLongField 見下面的說明 
17)DatePointField, DoublePointField, FloatPointField, IntPointField, LongPointField 見下面的說明 
18)UUIDField 定義一個document的唯一值。官方文件提到在SolrCloud環境下,不能保證唯一性,不建議使用,推薦使用UUIDUpdateProcessorFactory去生成UUID。 
另外,在solr給的sample檔案裡,對於數值型別,定義瞭如下三個fieldType(以int為例): 
a). <fieldType name="pint" class="solr.IntPointField" docValues="true" /> 
b). <fieldType name="int" class="solr.TrieIntField" docValues="true" precisionStep="0" positionIncrementGap="0"/> 
c). <fieldType name="tint" class="solr.TrieIntField" docValues="true" precisionStep="8" positionIncrementGap="0"/> 
對於a),對於數值型別的field,索引時使用KD-trees。 sample檔案裡提到要比 Trie*Field更快更高效,但是不支援某些特性。並未說明不支援哪些特性,所以並不推薦使用 
對於b),通常用於確定性搜尋,比如要搜尋年齡是18的人。 
對於c),用於範圍搜尋,比如要搜尋某個年齡段的人。

也就是說,我們如果要對某項資料(比如人的資訊,其中包含年齡欄位)進行索引,一個人有唯一的年齡值,但是我們搜尋的時候,可能需要進行確定年齡的搜尋和年齡段的搜尋,那麼我們就需要定義兩個年齡相關的field,其中一個field的fieldType為int,另一個field的fieldType為tint。

對 precisionStep 的一些說明:

比如 單個車的價格是不一樣的,我們通常會查詢某個價格範圍內的車子資訊。假設所有車輛價格範圍是1萬~1000萬,為了加快查詢速度,會把這個價格區間劃分為幾個區間進行索引。precisionStep的值差不就是劃分為多少個區間的意思。

2.5.1Analyzer
有些時候,我們需要自定義 fieldType。下面的例子就是自定義的 fieldType,<analyzer type="index"> 表示索引時怎麼處理,<analyzer type="query">表示查詢時怎麼處理。 
複製程式碼

<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.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
        -->
        <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>

tokenizer: 對輸入流進行分詞。這裡的“solr.” 代表:org.apache.solr.analysis. 這個包 
filter: 對tokenizer輸出的每一個分詞,進行處理。

2.5.2 Tokenizer
2.5.2.1. solr.StandardTokenizerFactory 
把文字用空格和標點符號分割。對於小數點(.),如果後面不是空格的話,將會被保留。如網址。連字元(-)的兩邊會被分割成兩個分詞(token)。 
引數:maxTokenLength 分詞的最大長度,超出部分將被忽略。 
example:

<analyzer>
    <tokenizer class="solr.StandardTokenizerFactory" maxTokenLength="100"/>
</analyzer>

輸入: Please email [email protected] by 03-09, re: m37-xq. 
輸出: “Please”, “email”, “john.doe”, “foo.com”, “by”, “03”, “09”, “re”, “m37”, “xq” 
2.5.2.2. solr.ClassicTokenizerFactory 
跟StardardTokenizerFactory差不多,不同點如下: 
(1)連字元(-)兩邊如果有數字的話,將不會被拆分。 
(2)能識別郵件地址 
引數:maxTokenLength 分詞的最大長度,超出部分將被忽略。 
示例: 
輸入: Please email [email protected] by 03-09, re: m37-xq. 
輸出: “Please”, “email”, “[email protected]“, “by”, “03-09”, “re”, “m37-xq” 
2.5.2.3. solr.KeywordTokenizerFactory 
整個文字做為一個分詞。 
示例: 
輸入: Please email [email protected] by 03-09, re: m37-xq. 
輸出: “Please email [email protected] by 03-09, re: m37-xq” 
2.5.2.4. solr.LetterTokenizerFactory 
連續的字母做為一個分詞。 
示例: 
輸入: I can’t. 
輸出: “I”, “can”, “t” 
2.5.2.5. solr.LowerCaseTokenizerFactory 
按非字母進行分詞,並轉化成小寫。 
示例: 
輸入: I LOVE my iPhone. 
輸出: “I”, “love”, “my”, “iphone” 
2.5.2.6. solr.NGramTokenizerFactory 
對文字按照 n-Gram 進行分詞。 
引數:minGramSize (default 1) – 必須 > 0 
maxGramSize (default 2) – 必須 >= minGramSize 
示例: 
輸入: hey man 
輸出: “h”, “e”, “y”, ” “, “m”, “a”, “n”, “he”, “ey”, “y “, ” m”, “ma”, “an” 
2.5.2.7. solr.EdgeNGramTokenizerFactory 
對文字按照 n-Gram 進行分詞。 
引數:minGramSize (default 1) – 必須 > 0 
maxGramSize (default 1) – 必須 >= minGramSize 
side (default “front”) – “front” or “back” 
示例: 
輸入: babaloo 
輸出(default): “b” 
輸出(minGramSize=2, maxGramSize=5):”ba”, “bab”, “baba”, “babal” 
2.5.2.8. solr.ICUTokenizerFactory 
對多語言文字,基於其語言特性,進行恰當地分詞。 
引數:rulefile– 此值的格式: 四個字母的語言程式碼+“:”+檔案路徑

<analyzer>
    <tokenizer class="solr.ICUTokenizerFactory" rulefile="Latn:my.Latin.rule.rbbi,Cyrl:my.Cyrillic.rules.rbbi"/>
</analyzer>

注意:需要新增額外的jar包到Solr 的 classpath下。 
2.5.2.9. solr.PathHierarchyTokenizerFactory 
用replace指定的字元代替delimiter指定的字元,並進行分詞 
引數:delimiter (no default) 
replace (no default) 
示例:

<analyzer>
    <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="\" replace="/"/>
</analyzer>

輸入: d:\usr\local\apache 
輸出: “d:”, “d:/usr”, “d:/usr/local”, “d:/usr/local/apache” 
2.5.2.10. solr.PatternTokenizerFactory 
利用Java的正則表示式進行分詞。 
引數:pattern – 必填 
group – 可選。預設 -1 。 
-1 表示正則表示式作為分割符。0 表示符合正則表示式的才會被認為是一個分詞而保留。大於0的值(比如2)表示只保留符合正則表示式的部分中的第2個部分。 
示例:

<analyzer>
    <tokenizer class="solr.PatternTokenizerFactory" pattern="\s*\s*" />
</analyzer>

輸入: fee,fie, foe , fun, foo 
輸出: “fee”, “fie”, “foe”, “fun”, “foo” 
示例:

<analyzer>
    <tokenizer class="solr.PatternTokenizerFactory" pattern="[A-Z][A-Za-z]*" group="0"/>
</analyzer>

輸入: Hello, My name is Rose. 
輸出: “Hello”, “My”, “Rose” 
2.5.2.11. solr.UAX29URLEmailTokenizerFactory 
空格和標點符號做為分割符。小數點如果後面不是空格,則被保留。連線符(“-”)連起來的各個部分將被劃分為獨立的分詞,除非其中包含數字。網址、Email、IP地址將會被認為一個整體。 
引數:maxTokenLength – 長度超過此值的分詞將會被截斷。 
2.5.2.12. solr.WhitespaceTokenizerFactory 
僅將空格做為分割符。 
引數:rule – “java”: 預設值,利用Character.isWhitespace(int)確定是否是whitespace。 “unicode”: 利用Unicode的whitespace做為分割符。

2.5.3 filter
自定義fieldType時,通常還會用到filter。filter必須跟在tokenizer或其它filter之後。如:

<fieldType>
    <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory" />
    </analyzer>
</fieldType>

Solr 提供了很多的filter,具體如下: 
1. ASCII Folding Filter 
2. Beider-Morse Filter 
3. Classic Filter 
4. Common Grams Filter 
5. Collation Key Filter 
6. Daitch-Mokotoff Soundex Filter 
7. Double Metaphone Filter 
8. Edge N-Gram Filter 
9. English Minimal Stem Filter 
10. English Possessive Filter 
11. Fingerprint Filter 
12. Flatten Graph Filter 
13. Hunspell Stem Filter 
14. Hyphenated Words Filter 
15. ICU Folding Filter 
16. ICU Normalizer 2 Filter 
17. ICU Transform Filter 
18. Keep Word Filter 
19. KStem Filter 
20. Length Filter 
21. Limit Token Count Filter 
22. Limit Token Offset Filter 
23. Limit Token Position Filter 
24. Lower Case Filter 
25. Managed Stop Filter 
26. Managed Synonym Filter 
27. N-Gram Filter 
28. Numeric Payload Token Filter 
29. Pattern Replace Filter 
30. Phonetic Filter 
31. Porter Stem Filter 
32. Remove Duplicated Token Filter 
33. Reversed Wildcard Filter 
34. Shingle Filter 
35. Snowball Porter Stemmer Filter 
36. Standard Filter 
37. Stop Filter 
38. Suggest Stop Filter 
39. Synonym Filter 
40. Synonym Graph Filter 
41. Token Offset Payload Filter 
42. Trim Filter 
43. Type As Payload Filter 
44. Type Token Filter 
45. Word Delimiter Filter 
46. Word Delimiter Graph Filter

2.6. defaultSearchField
defaultSearchField指定搜尋的時候預設搜尋欄位的值。

2.7. solrQueryParser
solrQueryParser指定搜尋時多個詞之間的關係,可以是or,and兩種。

2.8. 效能優化
1、 將所有隻用於搜尋的,而不需要作為結果的field(特別是一些比較大的field)的stored設定為false; 
2、 將不需要被用於搜尋的,而只是作為結果返回的field的indexed設定為false; 
3、 刪除所有不必要的copyField宣告為了索引欄位的最小化和搜尋的效率; 
4、 將所有的 text fields的index都設定成false,然後使用copyField將他們都複製到一個總的 text field上,然後進行搜尋。

六、solrconfig.xml

solrconfig.xml配置檔案主要定義了Solr的一些處理規則,包括索引資料的存放位置,更新,刪除,查詢的一些規則配置。

1、 solrconfig 成員
1.1 luceneMatchVersion
表示Solr底層依賴的lucene版本

1.2 lib
lib 定義了Solr需要額外引用的jar包位置。它告訴 Solr 如何去載入 solr plugins(Solr 外掛 ) 依賴的 jar 包,在 solrconfig.xml 配置檔案的註釋中有配置示例,例如: 
<lib dir="./lib" regex=”lucene-\w+\.jar”/> 
這裡的 dir 表示一個 jar 包目錄路徑,該目錄路徑是相對於你當前 core 根目錄的; regex 表示一個正則表示式,用來過濾檔名的,符合正則表示式的 jar 檔案將會被載入,如果對應的檔案不存在,會自動忽略這一配置,一般建議將其註釋掉,只新增需要使用的jar包。

1.3 dataDir
用來指定一個 solr 的索引資料目錄, solr 建立的索引會存放在 data\index 目錄下,預設 dataDir 是相對於當前 core 目錄 ( 如果 solr_home 下存在 core 的話 ) ,如果 solr_home 下不存在 core 的話,那 dataDir 預設就是相對於 solr_home 啦,不過一般 dataDir 都在 core.properties 下配置。

1.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時資料會丟失。且不支援索引複製

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

1.6 indexConfig
用於設定索引的低級別的屬性   

 <filter class="solr.LimitTokenCountFilterFactory" maxTokenCount="10000"/>//限制token最大長度
     <writeLockTimeout>1000</writeLockTimeout>//IndexWriter等待解鎖的最長時間(毫秒)。
     <maxIndexingThreads>8</maxIndexingThreads>//
     <useCompoundFile>false</useCompoundFile>//solr預設為false。如果為true,索引檔案減少,檢索效能降低,追求平衡。
     <ramBufferSizeMB>100</ramBufferSizeMB>//快取
     <maxBufferedDocs>1000</maxBufferedDocs>//同上。兩個同時定義時命中較低的那個。
     <mergePolicy class="org.apache.lucene.index.TieredMergePolicy">
        <int name="maxMergeAtOnce">10</int>
        <int name="segmentsPerTier">10</int>
     </mergePolicy>//合併策略
     <mergeFactor>10</mergeFactor>//合併因子,每次合併多少個segments。
     <mergeScheduler class="org.apache.lucene.index.ConcurrentMergeScheduler"/>//合併排程器。
     <lockType>${solr.lock.type:native}</lockType>//鎖工廠。
     <unlockOnStartup>false</unlockOnStartup>//是否啟動時先解鎖。
     <termIndexInterval>128</termIndexInterval>//Lucene loads terms into memory 間隔
     <reopenReaders>true</reopenReaders>//重新開啟,替代先關閉-再開啟。
     <deletionPolicy class="solr.SolrDeletionPolicy">//提交刪除策略,必須實現org.apache.lucene.index.IndexDeletionPolicy
     <str name="maxCommitsToKeep">1</str>
     <str name="maxOptimizedCommitsToKeep">0</str>
     <str name="maxCommitAge">30MINUTES</str>// OR <str name="maxCommitAge">1DAY</str> 
     <infoStream   file="INFOSTREAM.txt">false</infoStream>//相當於把建立索引時的日誌輸出。

注:<lockType>${solr.lock.type:native}</lockType> 
設定索引庫的鎖方式,主要有三種: 
1.single:適用於只讀的索引庫,即索引庫是定死的,不會再更改 
2.native:使用本地作業系統的檔案鎖方式,不能用於多個solr服務共用同一個索引庫。Solr3.6 及後期版本使用的預設鎖機制。 
3.simple:使用簡單的檔案鎖機制 
4. hdfs: 使用HdfsLockFactory來支援讀取和寫入索引和事務日誌檔案到HDFS檔案系統

1.7 updateHandler

<!--updateHandler: 這個更新處理器主要涉及底層的關於如何更新處理內部的資訊。 -->
 <updateHandler class="solr.DirectUpdateHandler2">
    <updateLog>
      <str name="dir">${solr.ulog.dir:}</str>
    </updateLog>
    <autoCommit>    
      <maxDocs>10000</maxDocs> <!-- 觸發自動提交前最多可以等待提交的文件數量  -->   
      <maxTime>86000</maxTime> <!-- 在添加了一個文件之後,觸發自動提交之前所最大的等待時間--> 
    </autoCommit>    
    <!--一個postCommit的事件被觸發當每一個提交之後  -->
    <listener event="postCommit" class="solr.RunExecutableListener">   
      <str name="exe">snapshooter</str>   <!-- exe--可執行的檔案型別   -->
      <str name="dir">solr/bin</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>   
     <autoSoftCommit> 
       <maxTime>${solr.autoSoftCommit.maxTime:-1}</maxTime> 
     </autoSoftCommit>
 </updateHandler>

1.8 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數量
對於所有快取模式而言,在設定快取引數時,都有必要在記憶體、cpu和磁碟訪問之間進行均衡。統計資訊管理頁(管理員介面的Statistics)對於分析快取的 hit-to-miss 比例以及微調快取大小的統計資料都非常有用。而且,並非所有應用程式都會從快取受益。實際上,一些應用程式反而會由於需要將某個永遠也用不到的條目儲存在快取中這一額外步驟而受到影響。

1.9 requestDispatcher

<requestDispatcher handleSelect="false" >
    <!-- 這些設定說明Solr Requests如何被解析,以及對ContentStreams有什麼限制。 -->
    <requestParsers enableRemoteStreaming="true" 
                    multipartUploadLimitInKB="2048000"
                    formdataUploadLimitInKB="2048"
                    addHttpRequestToContext="false"/>
    <!-- 設定HTTP快取的相關引數。Never304 即告訴伺服器,不管我訪問的資源有沒有更新過,都給我重新返回不走 Http 快取。-->
    <httpCaching never304="true" />
</requestDispatcher>

定義當有請求訪問Solr core時SolrDispatchFilter如何處理。

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

1.10 requestHandler

<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>

定義請求處理器行為。

這個 requestHandler 配置的是請求 URL /query 跟請求處理類 SearcherHandler 之間的一個對映關係,即你訪問http://localhost:8080/solr/core/query?q=xxx 時,會交給 SearcherHandler 類來處理這個 http 請求,你可以配置一些引數來干預 SearcherHandler 處理細節。 
其他的一些 requestHandler 說明就略過了,其實都大同小異,就是一個請求 URL 跟請求處理類的一個對映 , 就好比 SpringMVC 中請求 URL 和 Controller 類的一個對映。

1.11 searchComponent
用來配置查詢元件比如 SpellCheckComponent 拼寫檢查,有關拼寫檢查的詳細配置說明留到以後說到 SpellCheck 時再說吧。 
<searchComponent name="terms" class="solr.TermsComponent"/> 
用來返回所有的 Term 以及每個 document 中 Term 的出現頻率 
<searchComponent class="solr.HighlightComponent" name="highlight"> 
用來配置關鍵字高亮的, Solr 高亮配置的詳細說明這裡暫時先略過,這篇我們只是先暫時大致瞭解下每個配置項的含義即可,具體如何使用留到後續再深入研究。 
有關 searchComponent 查詢元件的其他配置我就不一一說明了,太多了。你們自己看裡面的英文註釋吧,如果你實在看不懂再來問我。

<searchComponent name="suggest" class="solr.SuggestComponent">
    <lst name="suggester">
      <str name="name">mySuggester</str>
      <str name="lookupImpl">FuzzyLookupFactory</str>
      <str name="dictionaryImpl">DocumentDictionaryFactory</str>
      <str name="field">cat</str>
      <str name="weightField">price</str>
      <str name="suggestAnalyzerFieldType">string</str>
    </lst>
  </searchComponent>

1.12 queryResponseWriter
這個是用來配置 Solr 響應資料轉換類, JSONResponseWriter 就是把 HTTP 響應資料轉成 JSON 格式, content-type 即 response 響應頭資訊中的 content-type, 即告訴客戶端返回的資料的 MIME 型別為 text/plain ,且 charset 字符集編碼為 UTF-8. 
內建的響應資料轉換器還有 velocity , xslt 等,如果你想自定義一個基於 FreeMarker 的轉換器,那你需要實現 Solr 的 QueryResponseWriter 介面,模仿其他實現類,你懂的,然後在 solrconfig.xml 中新增類似的<queryResponseWriter> 配置即可 
最後需要說明下的是 solrconfig.xml 中有大量類似 <arr> <list> <str> <int> 
arr:即 array 的縮寫,表示一個數組, name 即表示這個陣列引數的變數名 
lst即 list 的縮寫,但注意它裡面存放的是 key-value 鍵值對 
bool:表示一個 boolean 型別的變數 ,name 表示 boolean 變數名, 
同理還有int,long,float,str等等 
str: 即 string 的縮寫,唯一要注意的是 arr 下的 str 子元素是沒有 name 屬性的,而 list 下的 str 元素是有 name 屬性的

1.13 initParams
在處理程式配置之外定義請求處理程式引數

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