Solr CJKAnalyzerで日本語文章の検索をする その3 シンプルなschema.xml

CJKAnalyzerにパッチを当てたら
早速日本語ドキュメントのインデキシングをしたいところなのですが
その前にスキーマ定義です。


テストデータとして芸能人ブログのリストを使います。

URL,bloger,title
http://ameblo.jp/kamijiyusuke/,上地雄輔,オフィシャルブログ「神児遊助http://ameblo.jp/momokaeri/,桃華絵里,桃華絵里オフィシャルブログ
http://ameblo.jp/daigoblog/,DAIGO,DAIGO OFFICIAL BLOG
http://ameblo.jp/hoshino--aki/,ほしのあき,ほしのあき オフィシャルブログ by アメーバブログ
http://blog.excite.co.jp/shokotan/,中川翔子,中川翔子オフィシャルブログ しょこたん☆ぶろぐ
http://yamamoto-mona.cocolog-nifty.com/,山本モナ,山本モナオフィシャルブログ 山本モナのもなろ〜ぐ
http://manabekawori.cocolog-nifty.com/,眞鍋かおり,眞鍋かおりのココだけの話

後で、このCSVファイルを使ってインデキシングします。


フィールドは3つだけです。

  • URL : ブログのURL。ユニークキーになります。
  • bloger : ブロガの名前
  • title : ブログのタイトル


これにあわせたschema.xmlはこんな感じになります。
なるべくシンプルに書いています。

<?xml version="1.0" encoding="UTF-8" ?>
<schema name="example" version="1.1">

  <!-- データ型の定義 -->
  <types>

    <!-- string型の定義。トークナイズしないのでanalyzerの指定とかなし -->
    <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNo
rms="true"/>

    <!-- date型の定義。これもトークナイズしないのでanalyzerの指定とかなし -->
    <fieldType name="date" class="solr.DateField" sortMissingLast="true" omitNor
ms="true"/>

    <!-- CJKTokenizerFactoryでトークナイズする。text_cjk型 -->
    <fieldtype name="text_cjk" class="solr.TextField">
      <analyzer>
        <tokenizer class="solr.CJKTokenizerFactory"/>
      </analyzer>
    </fieldtype>

 </types>
 <!-- データ型の定義 ここまで -->

 <!-- fieldの定義 -->
 <fields>
   <!-- Valid attributes for fields:
     name: 必須。フィールドの名前
     type: 必須。データの型。fieldTypeで定義したもののどれか。
   -->

   <!-- ブログのURL string型-->
   <field name="URL" type="string" indexed="true" stored="true"/>

   <!-- ブロガの名前 text_cjk型-->
   <field name="bloger" type="text_cjk" indexed="true" stored="true"/>

   <!-- ブログのタイトル text_cjk型-->
   <field name="title" type="text_cjk" indexed="true" stored="true"/>

  <!-- インデックスした日時が勝手に"timestamp"に入る -->
   <field name="timestamp" type="date" default="NOW"/>

 </fields>
 <!-- fieldの定義 ここまで-->

 <!-- ユニークキーになるフィールドの指定-->
 <!-- トークナイズされない"string"であること-->
 <uniqueKey>URL</uniqueKey>

 <!-- 検索フィールドが指定されないときに検索されるデフォルトのフィールド -->
 <defaultSearchField>title</defaultSearchField>

 <!-- 複数後で検索されたときのデフォルトの演算子の指定 "AND|OR" -->
 <!-- ORで指定しておけばスコアでソートしたときに
      多くの語が含まれているドキュメントが上位に来るので
      検索エンジンっぽくなってカコイイ。
      ANDを使うのは大量にドキュメントがある場合だけ -->
 <solrQueryParser defaultOperator="OR"/>

</schema>


書いているのはこんなことです。

  • 型の定義
    • string型 : トークナイズされない文字列型。主にユニークキーフィールドに使います。
    • date型 : 日付型
    • text_cjk型 : CJKAnalyzerでトークナイズされる文字列型
  • フィールドの定義
    • URL : string型だよ
    • bloger : text_cjk型だよ
    • title : text_cjk型だよ
    • timestamp : date型だよ。インデキシングしたときの時間を自動的に入れるよ。
  • その他
    • ユニークキー ( uniqueKey ) はURLだよ
    • デフォルトの検索フィールド ( defaultSearchField ) はtitleだよ
    • デフォルトの検索演算子 ( defaultOperator ) は ORだよ

デフォルトのschema.xml
いろんな機能の説明も含めて書かれているのでかなり複雑なのですが
上記3フィールドに絞るとコレだけでおkです。


このファイルを
$TOMCAT_HOME/webapps/solr/conf/schema.xml
において使います。
オリジナルはバックアップしといた方がいいですね。


次はいよいよインデキシングします。


ではでは