MySQLの全文検索において1文字でも検索できるようにする方法

はじめに

エキサイトで内定者インターンをしている岡崎です。

前回、MySQLで全文検索をする方法を紹介しました。しかし、そこでは1文字で指定すると、全文検索することができない問題がありました。 よって、MySQL全文検索で1文字でも検索できるようにする方法を紹介します。

原因

MySQL全文検索で使われるFULLTEXT INDEXでは、N-gramが用いられます。 N-gramとは、任意の文字列をN文字で区切って表します。

例えば、簡単サンプルという文字列をN=2で区切るとすれば、

'簡単' '単サ' 'サン' 'ンプ' 'プル'

という形になります。FULLTEXT INDEXはデフォルトでN=2となるので、対象の文章を2文字で区切ってINDEXしておき、一部でもキーワードと一致していれば取得対象となります。

よって、水や塩といった1文字で全文検索ができなかったのは、1文字の文字列ではINDEXに該当しなかったことが原因であることが分かります。

対策

1文字で全文検索をしたい場合は、FULLTEXT INDEXで2文字で区切っているので、1文字で区切るようにする方法が考えられます。 INDEXのN-gramの指定は、my.confで行われるので、そこでngram_token_sizeを変えれば、任意のN文字で区切ることができます。

今回の場合は、1文字で区切りたいので、以下のように記載しました。

ngram_token_size = 1

この後、MySQLを必ず再起動させましょう。 また、すでにINDEXを張ってしまっている場合は、もう一度張り直しましょう。 これらをしないと、N=2で張ったINDEXのままなので、設定が反映されません。

これで全文検索で1文字で指定された場合でも結果が取得できます。

問題点

しかし、上記の方法ではINDEXの数が膨大になってしまうという問題があります。 よって、現状ではN=1で区切ることがない場合は使わないなど、優先したい事項によって使い分けていくくらいしか対策が思いつきません。 根本的な解決を知っている方は、ぜひ教えてください!

最後に

今回はMySQL全文検索において、1文字でも指定して検索できるようにする方法を紹介しました。 今後もたくさん学びながら、アウトプットを続けていきたいです。 ここまで読んでいただきありがとうございました。