今週は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>
結果
タイトル | 本文 | a | href | url | ゆー | あー | る | える | a |