2012年04月14日

Lucene/Solr3.6リリース - 形態素解析が使えるようになった

今週はAmazonのCloudSearchが発表されたり、Lucene/Solrの3.6がリリースされたりと、全文検索さんとお付き合いしている人たちにはアドレナリンが出やすい1週間でした。

3.6には形態素解析を使ったAnalyzer(Kuromoji)が入るなど、日本人にとっては脳内物質が駆けめぐりやすいリリースになっているようです。β‐エンドルフィン。チロシン。エンケファリン。

とりあえず触ってみたところとかをメモ。


Change Logとか

Lucene3.6のChange Log
core : http://lucene.apache.org/core/3_6_0/changes/Changes.html
contrib : http://lucene.apache.org/core/3_6_0/changes/Contrib-Changes.html

Solr3.6のRelease Note
http://wiki.apache.org/lucene-java/ReleaseNote36

SolrのJavaDocを見るとJapaneseTokenizerFactoryがいる
http://lucene.apache.org/solr/api/org/apache/solr/analysis/JapaneseTokenizerFactory.html

LuceneのJavaDocを見るとJapaneseTokenizerがいる
http://lucene.apache.org/core/3_6_0/api/all/org/apache/lucene/analysis/ja/JapaneseTokenizer.html


さっそくJapaneseTokenizerをSolrで使ってみる

名前はJapaneseTokenizerですが、中身はKuromojiです。

JapaneseTokenizerのSolrでの使い方は、exampleの中のschema.xmlにtext_jaという名前で、下記みたいな感じで(コメントは改変)定義されていました。

<fieldType name="text_ja" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
  <analyzer>
    <!-- modeはnormal,search,extendedがある。 -->
    <tokenizer class="solr.JapaneseTokenizerFactory" mode="search"/>
    <!-- ユーザ辞書を定義する場合は下記のような感じで。 -->
    <!--<tokenizer class="solr.JapaneseTokenizerFactory" mode="search" userDictionary="lang/userdict_ja.txt"/>-->
    <!-- 動詞とかを基本形でインデックスに登録するフィルタ。確かlucene-gosenにいたヤツだっけか。 -->
    <filter class="solr.JapaneseBaseFormFilterFactory"/>
    <!-- いらない品詞はインデックスに登録しないフィルタ。 -->
    <filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="lang/stoptags_ja.txt" enablePositionIncrements="true"/>
    <!-- 全角のローマ字を半角にしたり、半角カナを全角にするフィルタ。 (Unicode NFKC subset) -->
    <filter class="solr.CJKWidthFilterFactory"/>
    <!-- 一般的過ぎる文字をフィルタリング。「てにをは」とか「です、ます」とか。 -->
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ja.txt" enablePositionIncrements="true" />
    <!-- フィルターとフィルタみたいな片仮名の表記揺れに関するフィルタ。 -->
    <filter class="solr.JapaneseKatakanaStemFilterFactory" minimumLength="4"/>
    <!-- ローマ字を小文字にするフィルタ。 -->
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

試しに「この日本語は、どうインデックスに入れられるか。」という文字列を上記の設定に対して通して見ると、下記のような結果になりました。

この日本語どうインデックス入れられる
↓ JapaneseBaseFormFilterで基本形に
この日本語どうインデックス入れるられる
↓ StopFilterで「は」、「に」、「か」などが削られる
この日本語どうインデックス入れるられる
↓ JapanesePartOfSpeechStopFilterで接続し、助詞、助動詞、記号などが削られる
日本語どうインデックス入れる

CJKTokenizerも変わったらしい

CJKTokenizerがdeplecatedになって、StandardAnalyzer+CJKBigramFilterを使うようになったようです。

<fieldType name="text_cjk" class="solr.TextField" positionIncrementGap="100">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.CJKWidthFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <!-- 漢字と平仮名をbi-gramにしてみる -->
    <filter class="solr.CJKBigramFilterFactory" han="true" hiragana="true" katakana="false" hangul="false"/>
  </analyzer>
</fieldType>

上記のように、漢字、平仮名、カタカナ、ハングルに対して、それぞれbi-gramにするかどうかが設定できるようです。

試しに「この日本語は、どうインデックスに入れられるか。」という文字列を入れてみると下記のような結果になりました。

このの日日本本語語はどうインデックスに入入れれらられれるるか

上の設定でkatakanaをfalseにしているので、「インデックス」がbi-gramになってません。割と便利。


HTMLStripCharFilter

HTMLStripCharFilterが新しくなったとか。

JFlex-based HTMLStripCharFilter replacement
https://issues.apache.org/jira/browse/LUCENE-3690

とりあえずこんな定義をしてみる。

<fieldType name="text_ja_html" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
  <analyzer>
    <tokenizer class="solr.JapaneseTokenizerFactory" mode="search"/>
    <charFilter class="solr.HTMLStripCharFilterFactory" escapedTags="a, title" />
   </analyzer>
</fieldType>

こんなHTMLをインデックスに入れようとしてみる。

<html><script>hoge</script>
<head><title>タイトル</title>
<body>
本文<br>
<a href="url">ゆーあーるえる</a>
</body>
</html>

結果

タイトル本文ahrefurlゆーあーえるa