質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

Q&A

解決済

2回答

6880閲覧

MySQLのフルテキストインデックス検索で完全一致検索をしたい

tesopgmh

総合スコア146

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

0グッド

1クリップ

投稿2017/05/19 00:25

編集2017/05/19 00:31

形態素解析の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万を超えるのでフルテキストを使わずに、インデックスの効かない「%フガ原宿店%」検索は出来ません

お分かりになる方助けてくださいませ

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

さきに全文検索で「フガ」「原宿」「店」の3つが全て合致する
レコードを抽出をしてその結果から「フガ原宿店」をLIKEで
抽出すればいいでしょう

全文検索で絞込が甘いようであれば、そのキーワードは全文検索に
適してないので分かち書きの単位がかわるような工夫をしてください

投稿2017/05/19 00:38

yambejp

総合スコア114583

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tesopgmh

2017/05/19 09:04

>さきに全文検索で「フガ」「原宿」「店」の3つが全て合致する >レコードを抽出をしてその結果から「フガ原宿店」をLIKEで >抽出すればいいでしょう テンポラリテーブルを作るのでしょうか?もう少し具体的な情報を頂けると嬉しいです >適してないので分かち書きの単位がかわるような工夫をしてください ググったのですが適切な情報はなく 上記は具体的にどういった手法でしょうか??
yambejp

2017/05/19 09:05

テンポラリでもいいですし、サブクエリでもできませんか?
tesopgmh

2017/05/19 09:15

ごめんなさい、SELECTをSELECTできるんですね、初めて知りました これで割と速く検索もできます、ありがとうございます!
guest

0

完全一致検索なら、MATCH ... AGAINSTを使わずに、SELECT * FROM `huga` WHERE `hoge` = 'フガ原宿店' でいいと思うのですが。

投稿2017/05/19 00:32

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tesopgmh

2017/05/19 09:01

基本的に部分一致検索をしたくて、たまに完全一致(完全一致しないものは出さない)したいです 「TEXT+フルテキストインデックス」をLIKEで完全一致検索すると遅いです(100万行で6秒でした) 「VARCHAR+通常インデックス」だと前後部分一致が苦手で 「TEXT+フルテキストインデックス」だと完全一致が出来なくて困ってます
maisumakun

2017/05/19 09:02

完全一致なら、LIKEすらいらないですよね?
tesopgmh

2017/05/19 09:29

どういうことですか??LIKEではなく=で検索するということ?? 「TEXT+フルテキストインデックス」のカラムをLIKEでも=でも検索すると遅いですよ SELECT * FROM `huga` WHERE `hoge` LIKE 'フガ,原宿,店'; SELECT * FROM `huga` WHERE `hoge` = 'フガ,原宿,店'; 10秒 SELECT * FROM `huga` WHERE MATCH(`hoge`) against('フガ,原宿,店'IN BOOLEAN MODE); 0.00X秒
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問