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

エンジニアの技術的独り言

技術的な独り言を書いています。独り言なのでどうでもいいことです。でも他の人の参考になればとっても嬉しいです。

SQL Azure のFull-Text Searchが微妙なので暫定対応をする~形態素解析のせいでしょう~

  • フルテキスト検索の仕組み

通常のLIKE検索では遅い
⇒LIKE比較は負荷が高い
⇒LIKE検索したい対象を言葉に分解してそれぞれにインデックスをはれば、その言葉と一致で検索することでLIKE検索のようなものを内部的に一致検索で速くする

っていうのがざっくりした自分の理解です。

参考記事が下記にあります。

ryuchan.hatenablog.com

ほぼ、上記を同じような内容なのですが、
こちらでは、SQL Azureを使った場合の情報です。

現状、Full-Text Searchにおいて、SQL AzureではSQL Serverの全機能はサポートされていません。(プレビュー版ですからね)
どこが具体的に違うかまでは調査してないです。
Full-Text Search is now available for preview in Azure SQL Database | Microsoft Azure Blog

そのため、類似語辞典などの機能も恐らく使えないです。(試していません。。。)

  • 暫定対応

さて、本題に入りますが、上記のページにもあるように、
Full-Text Searchが微妙な理由はズバリ形態素解析の精度です。

SQL Server での形態素解析では、「片頭痛」を「片頭痛」としてしか解析してくれません。
片頭痛」と「頭痛」に分解してくれると良いんですけどね。
それをやるにはmecabなどの形態素解析ツールを別途取り入れる必要がありそうです。

ただ、「片頭痛」としてしか解析してくれないものの、「頭痛」と検索してヒットさせたい場合どうするのかという点において、

select * from hogehoge
 where Contains((hoge_culumn),'*頭痛*')

と書いてみても「頭痛」しかヒットしてくれません。
ただ、これを

select * from hogehoge
 where Contains((hoge_culumn),'"*頭痛*"')

と二重引用符をつければ正しくLIKE判定してくれるみたいで、「片頭痛」もヒットしてくれます。


ただし、フルテキスト検索にLIKE検索を混ぜたような対応なので、ただのフルテキスト検索よりは若干パフォーマンスは落ちているような気はします。(ちゃんと計測はしていません)
それに加えて照合順序が適用されません。。。
つまり、「テスト」と検索しても「てすと」はヒットしません。
⇒どうも形態素解析しているワードブレーカーにおいて、各言語設定における照合順序が設定されているみたいです。
ドキュメント的にはSQL Serverの照合順序に依るっぽいことが書いてありますが、どうもSQL Azureだからか、適用されませんでした。

ちゃんとした対応をするためにはやはり形態素解析を改善した方がよさそうですね。
mecabについてはそのうち調べます。。。