悩み
Elasticsearchで色々検索しなければいけない機会があり、その時に「あれ?これカタカナで検索しても引っかからないぞ???」となって大変困ったことになりました。
例えば、「ライトセイバー」を「らいとせいばー」と検索しても引っかからなかった訳です。
この時、色々調べてなんとかなったので、それをまとめてみました。
この記事では、この問題の解決法しか書いていないので、
「そもそもElasticsearchとは?」みたいな説明はしませんので、ご注意ください。
初手結論
indexのsettings
にこれを追加すればできるようになりました。
analyzer
のkuromoji
のfilter
部分はお好みで追加したり、削除したりしてください。
"analysis" : {
"filter" : {
"kuromoji_multiplexer" : {
"type" : "multiplexer",
"filters" : [
"lowercase",
"lowercase, porter_stem",
"kuromoji_readingform"
]
}
},
"analyzer" : {
"kuromoji_analyzer" : {
"filter" : [
"kuromoji_part_of_speech",
"cjk_width",
"kuromoji_stemmer",
"lowercase",
"kuromoji_multiplexer"
],
"char_filter" : [
"icu_normalizer"
],
"tokenizer" : "kuromoji_tokenizer"
}
}
},
詳しく説明していきます。
まずは"flter"
の部分でカスタムフィルターを定義しています。(ここではkuromoji_multiplexe
)
ここで重要なのは"type": "multiplexer"
の部分です。
Elasticsearchのmultiplexer
のタイプをつけた場合、そのフィルターは一つの検索後に対して複数のトークンを作成してくれます。
例えば、「this is a pen」と検索した場合、「THIS IS A PEN」とも検索してくれるような感じですね。
この時の小文字から大文字への変換をどうするか?というのを決めるのが"filter"
の項目になります。
今回はフィルターにlowercase
、lowercase, porter_stem
、kuromoji_readingform
の三つのフィルターを指定していますので、これらを使ってトークンを別の文字列として複製してくれます。
(kuromoji_readingform
では「だいふく」を「ダイフク」とも検索してくれます。)
そして、"analyzer"
項目の"filter"
部分で先ほど作ったカスタムフィルターであるkuromoji_multiplexe
を追加しています。
これで、ひらがなで検索した際にもカタカナのものが検索に引っ掛かるようになりました!