読者です 読者をやめる 読者になる 読者になる

文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

solr3.6で形態素解析のユーザ定義辞書を使用する

solr

前回は同義語の設定をしたので、今回はユーザ定義辞書を使ってみます。

まずは辞書も同義語も設定していない状態。
f:id:treeapps:20120503210957p:image
形態素解析」という文字列を検索したのですが、
クエリー・インデックス共に「形態素」「解析」となってしまいましたね。
ではここから辞書の設定をしましょう。

schema.xmlのtext_jaのtokenizeの部分に「userDictionary="lang/userdict_ja.txt"」を追加します。

<fieldType name="text_ja" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
	<analyzer type="index">
		<tokenizer class="solr.JapaneseTokenizerFactory" mode="search" userDictionary="lang/userdict_ja.txt" />
		<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" tokenizerFactory="solr.JapaneseTokenizerFactory"/>
		・・以下略・・
	</analyzer>
	<analyzer type="query">
		<tokenizer class="solr.JapaneseTokenizerFactory" mode="search" userDictionary="lang/userdict_ja.txt" />
		<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" tokenizerFactory="solr.JapaneseTokenizerFactory"/>
		・・以下略・・
	</analyzer>
</fieldType>

userdict_ja.txtに以下を追記する。

形態素解析,形態素解析,ケイタイソカイセキ,カスタム名詞

tomcatを再起動し、再度検索。
f:id:treeapps:20120503212534p:image
よし。「形態素」「解析」から、「形態素解析」になりました!
では、synonyms.txtに「kuromoji,形態素解析」を追加してみましょう。
同義語に対しての辞書ってどうなるのかな。kuromojiと検索すると「形態素解析」がヒットするはず。
f:id:treeapps:20120503213242p:image
!?
同義語に設定した「形態素解析」が「形態素」「解析」になってる!
つまり、同義語に対して辞書が効いてない!
「形態素」「解析」になってしまったせいで、「形態素解析」がヒットしなくなってしまいました。

これでは残念ですね。では、同義語に対しも辞書が有効になるようにします。
以下のように、「solr.SynonymFilterFactory」に対しても「userDictionary="lang/userdict_ja.txt"」を追加します。

<fieldType name="text_ja" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
	<analyzer type="index">
		<tokenizer class="solr.JapaneseTokenizerFactory" mode="search" userDictionary="lang/userdict_ja.txt" />
		<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" tokenizerFactory="solr.JapaneseTokenizerFactory" userDictionary="lang/userdict_ja.txt"/>
		・・以下略・・
	</analyzer>
	<analyzer type="query">
		<tokenizer class="solr.JapaneseTokenizerFactory" mode="search" userDictionary="lang/userdict_ja.txt" />
		<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" tokenizerFactory="solr.JapaneseTokenizerFactory" userDictionary="lang/userdict_ja.txt"/>
		・・以下略・・
	</analyzer>
</fieldType>

では検索。
f:id:treeapps:20120503214240p:image
キターーー!!
同義語に対しても、同義語でない文字列に対しても、辞書が有効になりました!

では、「形態素」で検索したらどうなるのかな、と。
f:id:treeapps:20120916221009p:plain
あ・・・ヒットしない。。これはよろしくないですね。
こういう場合に同義語辞書が活用できます。
synonyms.txtを以下のように修正します。
■修正前
kuromoji,形態素解析
■修正後
kuromoji,形態素,形態素解析

さて、これでどうか。
f:id:treeapps:20120916221330p:plain
今度こそキターーー!!

これで同義語も辞書も心置きなく使えますね!

Apache Solr入門 ―オープンソース全文検索エンジン

Apache Solr入門 ―オープンソース全文検索エンジン