schema.xmlは名前の通りインデックスファイルのスキーマを定義しています。これは、schema要素の直下にtypes要素とfields要素があります。types要素は、フィールドが取りうる型fieldTypeで定義します。一番最初の要素を見るのが分かりやすいと思います。
<fieldtype class="solr.StrField" name="string" omitnorms="true" sortmissinglast="true">
ここでは、stringと言う型を定義しています。それに対応するclassがsolr.StrFieldになっています。classの値はjavaのクラスファイルです。solrはsolrのパッケージへのエイリアスです。
各型の定義でインデクシングに使用するアナライザを"analyzer"で指定します。analyzerの中では大文字を小文字に正規化したり、シノニムに対応したりもできるようです。Luceneを見れば分かりますが、日本語を処理するanalyzerはいくつかありますが、CJKAnalyzerを使いたい場合は、次のように書きます。こういう風に書けば日本語で検索できるようになるってことですね。
<fieldType name="text_cjk" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.CJKTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.CJKTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
次にfieldsでschemaが取り得るフィールドを定義していきます。こっちは、fieldの名前とfieldTypeで定義した型を指定します。それ以外にインデクシングの対象にするためにindex=trueを指定します。
Luceneで高速にハイライトするFastVectorHightlighterを使いたい場合は、termVectors="true" termPositions="true" termOffsets="trueを指定します。これを指定しないと以前のHighlighterが使われちゃいます。こんな感じになります。
<field name="content" type="text_cjk" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true" />
こんな風に書いておけば、fieldを指定できます。
僕は使っていないのですが、dynamicFieldと言うモノがあります。名前を*_textの用に書いておけば、フィールド名が_textで終わるフィールドは特定の型に対応づけることができます。fieldだけだと堅いスキーマになりますが、簡単なパターンマッチで動的にフィールドが定義できます。
dynamicFieldを使えば、実行時にフィールドが増えていきますが、管理が煩雑になります。全文検索でなんでもいいから引っかけたいよ、と言う場合は、copyFieldが便利です。特定のフィールドは、指定したフィールド、たとえばcontentフィールドに値をコピーすることができます。*を指定すれば、未知のフィールドの値をとりあず、特定のフィールドにコピーして検索の対象にできます。こっちはちょっと便利かもしれません
次回はsolrconfig.xmlと言うことで。
でわでわ
0 コメント:
コメントを投稿