Solr Reference Guide 5.3:Documents, Fields, and Schema Design
Overview of Documents, Fields, and Schema Design
Solr 的基本假設很簡單:你給它一大堆資訊,然後你問它問題、得到你想要的資訊。
你餵它資訊的部分叫做 indexing 或 updating。
當你提出一個問題,那是一個 query。
理解 Solr 運作方式之一,是把它想成一本食譜活頁書。
每當你新增一個食譜到這本書裡,就在書的最後更新一個索引。
你列出這份新增食譜裡的每樣原料,以及頁碼。
假設你加入了100個食譜,使用這個索引,你可以很快找到使用鷹嘴豆或洋薊或咖啡做為原料的食譜。
使用這個索引,比你從頭到尾把食譜一個一個翻一遍,要快很多很多。
想像這本書裡有一千個食譜,甚至一百萬個食譜。
Solr 允許你可以對多個不同 field、不同的 type of entries 建立索引。
上面的例子只對一個 field 建立索引:原料。
你可以在索引裡放其他 fields,例如烹飪方式:亞洲、卡津、素食,或是準備時間的索引。
Solr 可以回答像這樣的問題:「有哪些卡津風格的食譜,使用血橙做為原料,可以在30分鐘之內準備好的?」
Schema 是你告訴 Solr 如何從輸入的文件建立索引的地方。
How Solr Sees the World
Solr 的資訊基本單元是一個 document,它是描述某些東西的資料集。
一個食譜 document 包含材料、製作方法、準備時間、烹飪時間、需要的工具等等。
關於一個人的 document 可能有:姓名、傳記、喜歡的顏色、鞋號。
關於一本書的 document 可能有:書名、作者、出版年、頁數等等。
Fields 裡面可以放不同類型的資料。
例如姓名 field,它是文字。
鞋號則可能是一個 floating point number,這樣它的值就可能是 6 或 9.5。
顯然,field 的定義是有彈性的(例如:你可以把鞋號定義成文字),但是如果你正確的定義你的 fields,Solr 才能夠正確的詮釋它們,然後當你的使用者們提出 query 的時候會得到比較好的結果。
你可以指定某個 field 的 type,以此來告訴 Solr 這個 field 會包含哪些類型的資料。
Field Analysis
Field analysis 告訴 Solr 在建索引時要如何處理進來的資料。這個程序更精準的名字是 processing 或是 digestion,不過正式的名稱是 analysis。
例如,我們考慮某個人的 document 裡面有個傳記 field。
這個傳記裡的每字都要建索引,這樣你才能很快找到哪些人的人生跟調味番茄醬、或蜻蜓、或密碼學有關。
但是,一個傳記裡很可能包含了很多你不在乎的字詞,而且你不希望它們塞滿你的索引,像是「the」「a」「to」等等。
而且,如果傳記裡有某一句的開頭是「Ketchup」這個第一個字母大寫的詞。
當某個使用者查詢「ketchup」的時候,你會希望 Solr 把這個人也找出來,即使它們的大小寫並不一致。
這些問題的解決方法就是 field analysis。
以傳記 field 來說,你可以告訴 Solr 要如何把它們切成字詞,你可以告訴 Solr 要把所有字詞都轉為小寫,而且你可以告訴 Solr 要把 accent marks 移除。
Solr Field Types
Field Type Definitions and Properties
一個 field type 定義包含四種資訊類型:
- 這個 field type 的名稱 (必要)
- 一個 implementation class 名稱 (必要)
- 如果這個 field type 是 TextField,供這個 field type 使用的 field analysis 的描述。
- Field type properties:這視 implementation class 的情況,有些 properties 可能是必要的。
Field Type Definitions in schema.xml
Field types 是在 schema.xml 裡定義。每一個 field type 在 fieldType 元素裡定義。
它們可以用 types 元素合成一個群組。
以下是一個名字叫做 text_general 的 field type 的定義範例:
<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" />
<!-- in this example, we will only use synonyms at query time
<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>
上例中的第一行包含了這個 field type 的名稱 text_general,以及 implementing class 的名稱 solr.TextField。
其餘的部份是關於 field analysis,這在「Understanding Analyzers, Tokenizers, and Filters」裡說明。
Implementing class 負責確認這個 field 會被正確的處理。
在 schema.xml 裡的 class name 裡面,solr 這個字串是 org.apache.solr.schema 或 org.apache.solr.analysis 的簡寫。
所以,solr.TextField 其實是 org.apache.solr.schema.TextField。
Field Types Included with Solr
StrField
TextField
TrieIntField
String (UTF-8 encoded string or Unicode).
Text, usually multiple words or tokens.
32-bit signed integer
Putting the Pieces Together
Working With Text
可以使用 copyField 把多個 field 放進一個單一的 text field 裡面,用來做關鍵字搜尋。