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 裡面,用來做關鍵字搜尋。