はじめに
Solrでは、扱う対象の言語に応じた Tokenizer や TokenizerFilter が用意されています。リファレンスに日本語用のものもまとめられています。リファレンスには何故か載っていないもののよく知られているフィルタとして JapaneseReadingFormFilter があります。これは、形態素解析後の単語の読みをインデックスするためのものです。
この JapaneseReadingFormFIlter を使って、漢字の読みで検索できるように設定してみました。
JapaneseReadingFormFilterの基本的な使い方
JapaneseTokenizer を使うフィールドダイプの定義に以下を追加します。
<filter class="solr.JapaneseReadingFormFilterFactory" useRomaji="false"/>
_default コンフィグセットの定義に倣うと、以下のようになります。
<dynamicField name="*_txt_ja_reading" type="text_ja_reading" indexed="true" stored="true"/> <fieldType name="text_ja_reading" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false"> <analyzer> <tokenizer class="solr.JapaneseTokenizerFactory" mode="search"/> <filter class="solr.JapaneseBaseFormFilterFactory"/> <filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="lang/stoptags_ja.txt" /> <filter class="solr.CJKWidthFilterFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ja.txt" /> <filter class="solr.JapaneseKatakanaStemFilterFactory" minimumLength="4"/> <filter class="solr.LowerCaseFilterFactory"/> <!-- 以下を追加 --> <filter class="solr.JapaneseReadingFormFilterFactory" useRomaji="false"/> </analyzer> </fieldType>
読みで検索できるようにする
JapaneseTokenizer で使われている Kuromoji はカタカナで読みを提供するので、JapaneseReadingFormFilter を通した結果はカタカナでインデックスされます。
[ { "id" : "1", "body_txt_ja_reading" : "Solr 8.4 からパッケージ管理機能が追加されました。リファレンスによると、ここでいうパッケージは1つまたは複数のプラグインを1つにまとめたものという意味のようです。Solr におけるパッケージ管理について調べました。" }, { "id" : "2", "body_txt_ja_reading" : "昨日の午後" } ]
この2つの文章をインデックスしたときのタームは以下のようになります。
上の基本的な設定の内容だと、インデックス作成時と検索時とで同じ Tokeinizer の設定になっているで、読みで検索するには不都合です。漢字表記とカタカナ表記とで単語の分割のされ方が異なる場合があるからです。
そこで、入力されたカタカナはそのまま利用するというルールにして、検索時には WhitespaceTokenizer を使うことにします。
<dynamicField name="*_txt_ja_reading" type="text_ja_reading" indexed="true" stored="true"/> <fieldType name="text_ja_reading" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false"> <analyzer type="index"> <tokenizer class="solr.JapaneseTokenizerFactory" mode="search"/> <filter class="solr.JapaneseBaseFormFilterFactory"/> <filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="lang/stoptags_ja.txt" /> <filter class="solr.CJKWidthFilterFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ja.txt" /> <filter class="solr.JapaneseKatakanaStemFilterFactory" minimumLength="4"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.JapaneseReadingFormFilterFactory" useRomaji="false"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.WhitespaceTokenizerFactory" rule="java"/> </analyzer> </fieldType>
この設定により、「キノウ」で検索すると文書1と2の両方が、「キノウ ゴゴ」で検索すると文書2だけがヒットするようにできました。
{ "responseHeader":{ "zkConnected":true, "status":0, "QTime":2, "params":{ "q":"キノウ", "defType":"edismax", "qf":"body_txt_ja_reading", "fl":"id,body_txt_ja_reading", "stopwords":"true", "_":"1606578263384"}}, "response":{"numFound":2,"start":0,"numFoundExact":true,"docs":[ { "id":"2", "body_txt_ja_reading":"昨日の午後"}, { "id":"1", "body_txt_ja_reading":"Solr 8.4 からパッケージ管理機能が追加されました。リファレンスによると、ここでいうパッケージは1つまたは複数のプラグインを1つにまとめたものという意味のようです。Solr におけるパッケージ管理について調べました。"}] }}
{ "responseHeader":{ "zkConnected":true, "status":0, "QTime":1, "params":{ "q":"キノウ ゴゴ", "defType":"edismax", "qf":"body_txt_ja_reading", "fl":"id,body_txt_ja_reading", "q.op":"and", "stopwords":"true", "_":"1606578263384"}}, "response":{"numFound":1,"start":0,"numFoundExact":true,"docs":[ { "id":"2", "body_txt_ja_reading":"昨日の午後"}] }}