形態素解析のMeCabとMysql5系MyISAMのFULLTEXTインデックスを使って検索機能を制作しています
「フガ原宿店」
上記を形態素解析して格納すると以下のようになり
「フガ,原宿,店」
「原宿」というキーワードでも引っかかるようになりますが
逆に「フガ原宿店」という完全一致で検索して、「完全一致しないものは出さない」にはどうしたらよいのでしょうか?
1.最後に完全な文字列を足して検索の際に形態素解析をせずに検索する
「フガ,原宿,店」+「フガ原宿店」=「フガ,原宿,店,フガ原宿店」
SELECT * FROM `huga` WHERE MATCH(`hoge`) against('フガ原宿店'IN BOOLEAN MODE);
しかし、これでは「フガ原宿店」ではうまくいくが、短い語句「原宿」だと、ないにも関わらずヒットしてしまう
2.形態素解析後のデータのカンマをエスケープして検索
「フガ,原宿,店」を「フガ,原宿,店」で検索してカンマをエスケープすることで完全一致させる
SELECT * FROM `huga` WHERE MATCH(`hoge`) against('フガ\,原宿\,店'IN BOOLEAN MODE);
そもそもエスケープ出来ないし、方法があるとしても
これも先ほどと同様「フガ原宿店」ではうまくいくが、短い語句「原宿」だと、ないにも関わらずヒットしてしまう
3.完全一致用のカラムを作る
「hoge」の横に形態素解析しない「hoge_kanzen」カラムを作ってそこにインデックスを張って完全一致(完全一致しないものは出さない)の場合はそこを検索する
カラム二倍に増えるし、なんかスマートじゃない。。。
「完全一致検索」なんて割とポピュラーな機能なのにみんなどうしてるんでしょうか?
やはり「前後部分一致検索用」と「完全一致用」とカラムを二つ作るしかないんでしょうか?
ちなみにレコード数は100万を超えるのでフルテキストを使わずに、インデックスの効かない「%フガ原宿店%」検索は出来ません
お分かりになる方助けてくださいませ

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/19 09:04
2017/05/19 09:05
2017/05/19 09:15