Apache Solr で全文検索

第3回 スキーマの設定方法

2013.03.21

今回はスキーマの設定方法について説明します。

スキーマには、検索したいドキュメントに含まれるフィールドの構造を定義します。

3.1 スキーマ定義ファイル

スキーマは各コアごとに conf/schema.xml ファイルに記述します。例えば、サンプルのcollection1コアの場合

${solr.solr.home}/collection1/conf/schema.xml

がスキーマ定義ファイルになります。

スキーマ定義ファイルに記述するのは主に以下の項目です。

  • フィールド (<fields>)
  • フィールドタイプ (<types>)

フィールドには検索したいデータを記述します。フィールドタイプには各フィールドのデータ型を記述します。

まず、スキーマを <schema> タグを使って定義します。

<?xml version="1.0" encoding="UTF-8" ?>
<schema name="スキーマ名" version="1.5">
...
</schema>

<schema>タグ内にフィールド、フィールドタイプを定義していきます。

3.2 フィールドの定義

フィールドは <fields> タグ内に <field> タグを使って定義します。

<fields>
  <field name="フィールド名" type="フィールドタイプ名" [オプション属性] />
  ...
</fields>

<field>タグのオプション属性には以下のものがあります。

  • indexed=”true/false”
    • trueをセットすると、インデックスが作成されそのフィールドで検索およびソートできるようになります。
  • stored=”true/false”
    • trueをセットすると、検索の結果にそのフィールドの値が含まれるようになります。
  • multiValued=”true/false”
    • trueの場合、1つのドキュメント中に複数のフィールドが現れることを示します。
  • required=”true/false”
    • trueの場合、このフィールドが必須であることを示します。required=”true”なフィールドがインデックスの追加時に含まれていない場合、エラーが返ります。
  • default=”デフォルト値”
    • インデックスの追加時のデフォルト値をセットします。

以下の属性もあるのですが、すみません、調べきれていません。

  • omitNorms=”true/false”
  • termVectors=”true/false”
  • termPositions=”true/false”
  • termOffsets=”true/false”

3.3 フィールドタイプの定義

フィールドタイプは <types> タグ内に <fieldType> タグを使って定義します。

<types>
<fieldType name="タイプ名" class="クラス名" [オプション属性] />
<fieldType name="タイプ名" class="solr.TextField" [オプション属性] >
  <analyzer>
      アナライザの定義
  </analyzer>
</fieldType>
...
</types>

単純な文字列や数値型はSolrが提供しているクラスを使って定義します。もちろん、自分で実装したクラスを使うことも可能です。

テキストデータを正規化したり変換(余計な文字を省いたり、大文字を小文字にしたり等)してからインデックス化したい場合にアナライザを使うことができます。アナライザを使う場合class属性にはsolr.TextFieldを指定します。

アナライザの指定

アナライザには

  • Char Filter
  • Tokenizer
  • Token Filter

を設定することができます。また、設定する際はChar Filter、Tokenizer、Token Filterの順に設定します。

それぞれの役割は以下の通りです。

  • Char Filter
    • 入力されたテキストの文字を処理(文字の追加、変更、削除)するのに使用します。
    • 0個以上指定可能。
  • Tokenizer
    • 入力されたテキストを各トークンに分割します。
    • 1つだけ指定可能。
  • Token Filter
    • Tokenizerが生成した各トークンを処理(トークンの追加、変更、削除)するのに使用します。
    • 0個以上指定可能。

3.4 ユニークキー

登録するドキュメントが一意であることを示すのに<uniqueKey>タグを使います。<uniqueKey>タグに設定したフィールドがそのドキュメントのユニークキーになります。

<uniqueKey>フィールド名</uniqueKey>

3.5 ダイナミックフィールド

ダイナミックフィールドを使うと、Solrの実行時にフィールドを定義し、ドキュメントに追加/削除することができます。ダイナミックフィールドの定義には <dynamicField> タグを使います。

<dynamicField name="フィールド名" type="フィールドタイプ名" [オプション属性] />

ダイナミックフィールドのフィールド名には “*” に接頭辞か接尾辞をつけた形で指定します。例えば、

<dynamicField name="*_i" type="int" indexed="true" stored="true" />

と定義した場合、フィールド名が “_i” で終わるフィールドを”int”型のデータとして実行時に登録することができるようになります。

3.6 コピーフィールド

コピーフィールドを使うと、ドキュメントの追加時に、source属性で指定したフィールドの値をdest属性で指定したフィールドにコピーします。インデックスはdest先のフィールドとして追加されます。

<copyField source="コピー元フィールド名" dest="コピー先フィールド名" />

以上です。今回はSolrのスキーマ定義方法についてざっくりと説明しました。

スキーマについての詳細は、collection1のschema.xmlに書かれているコメントか SolrのWebサイト を参照ください。

次回は実際にスキーマの定義を行いドキュメントの追加、検索をしてみたいと思います。

著者プロフィール

toza

ミドルウェアから上の層を色々とやってます。長春系八極拳使い。

記事一覧Index