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

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

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

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

Q&A

2回答

1427閲覧

MySQL全文検索における「単語多すぎ問題」について

nikuatsu

総合スコア177

MySQL

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

0グッド

2クリップ

投稿2022/04/03 08:45

実現したいこと

MySQL全文検索において、IN BOOLEAN MODE で長文の検索を実現したいです。

MySQL のメッセージ

どうやら単語が多すぎだとのエラーのようです。

#191 - Too many words in a FTS phrase or proximity search

該当のソースコード

こちらのCREATE、INSERTに対する問題です。(『吾輩は猫である』の一節を拝借しました。)

SQL

1CREATE TABLE my_sentences ( 2 ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, 3 sentence VARCHAR(500) NOT NULL, 4 PRIMARY KEY (ID), 5 FULLTEXT full_my_sentences (sentence) WITH PARSER ngram); 6 7INSERT INTO my_sentences ( sentence ) 8VALUES 9 ("その王様の所へ一人の女が本を九冊持って来て買ってくれないかと云ったんだそうですなるほど王様がいくらなら売るといって聞いたら大変な高い事を云うんですってあまり高いもんだから少し負けないかと云うとその女がいきなり九冊の内の三冊を火にくべて焚やいてしまったそうです惜しい事をしましたなその本の内には予言か何かほかで見られない事が書いてあるんですってへえー");

以下SELECTで上記のエラーとなります。

SQL

1SELECT * 2FROM my_sentences sentences 3WHERE MATCH (sentences.sentence) AGAINST ('その王様の所へ一人の女が本を九冊持って来て買ってくれないかと云ったんだそうですなるほど王様がいくらなら売るといって聞いたら大変な高い事を云うんですってあまり高いもんだから少し負けないかと云うとその女がいきなり九冊の内の三冊を火にくべて焚やいてしまったそうです惜しい事をしましたなその本の内には予言か何かほかで見られない事が書いてあるんですってへえー' IN BOOLEAN MODE);

試したこと

「Too many words?」と不思議に思いつつ、「単語の区切りを分かりやすくしてみたらどうだろう」と以下のようにカッコを入れてみたところエラーなく実現できました。

SQL

1SELECT * 2FROM my_sentences sentences 3WHERE MATCH (sentences.sentence) AGAINST ('「その王様の所へ一人の女が本を九冊持って来て買ってくれないかと云ったんだそうです」「なるほど」「王様がいくらなら売るといって聞いたら大変な高い事を云うんですって、あまり高いもんだから少し負けないかと云うとその女がいきなり九冊の内の三冊を火にくべて焚(や)いてしまったそうです」「惜しい事をしましたな」「その本の内には予言か何かほかで見られない事が書いてあるんですって」「へえー」' IN BOOLEAN MODE);

しかしこのような適切なカッコなく検索できるようにしたいのです。(ユーザーはどこに適切なカッコを置けばいいのか分からないためです。)

どうすればこのようなエラーを回避できるでしょうか。
よろしくお願い致します。

MySQLバージョン

MySQL 5.7 になります。

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

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

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

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

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

guest

回答2

0

実際の用途でそんな長文で検索することがあるのでしょうか?

「です」などで区切っては?

全文検索は万能ではありません。Google検索より見劣りします。
マニュアルを見直しては?

投稿2022/04/03 10:15

Orlofsky

総合スコア16419

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

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

nikuatsu

2022/04/04 01:00

ございます。 「です」があるとも限らないので…。形態素解析入れるのがいいでしょうか。 マニュアルありがとうございます。
guest

0

全文検索の守備範囲ではないということです
長文の一致をするなら普通にlikeやregexpでやればいいでしょう

投稿2022/04/04 00:33

yambejp

総合スコア117719

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

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

nikuatsu

2022/04/04 00:59

ありがとうございます。ある程度のあいまいさを持たせたいのですが、何か良い方法ございませんでしょうか。
yambejp

2022/04/04 01:13

> ある程度のあいまいさ ある程度の程度がわかりません 適当に分かち書きしてはどうですか?
nikuatsu

2022/04/04 02:26

失礼しました。IN BOOLEAN MODE程度のあいまいさです。 分かち書きというと、10文字ずつスペースを入れて AGAINST で扱う、みたいな意味ですか? そうだとして、いつ分かち書きすべきかで悩んでしまいそうです。質問のようにカッコがないときは10文字ずつスペースを入れて、カッコがあるときは入れないとするか、それとも全てにスペースを入れる方がわかりやすいでしょうか。 yambejp様ならどうするかを、ぜひ具体的に教えていただきたいです。
yambejp

2022/04/04 02:42

> yambejp様ならどうするか 私なら全文検索ではない方式でやりますね
nikuatsu

2022/04/04 03:28

IN BOOLEAN MODE程度のあいまいさを全文検索でなく実装する方法というのを知らないのですが、具体的にどんなものですか? もし仰る LIKE ならば「あいうえお」を検索するとき、 sentence LIKE %あい% OR sentence LIKE %いう% OR sentence LIKE %うえ% OR sentence LIKE %えお%  のようなことですか?(でもインデックスが効かないからこうではないですよね?)
yambejp

2022/04/04 03:37

短い文字なら全文検索の方が有利ですね あいうえおくらいなら全文検索で十分でしょう。 冗長な文書をヒットさせるのは現実的ではないということをお伝えしたつもりだったんですが・・・
nikuatsu

2022/04/04 03:58

あいうえおの例を出したのがまずかったでしょうか。あくまで質問にある文が対象なのでそのケースでの対処方法をお聞きしたいです。 そこで改めてですが、IN BOOLEAN MODE程度のあいまいさを全文検索でなく実装する方法というのを知らないのですが、具体的にどんなものですか? 質問にある文をどのように…?全文検索ではない方式というのが気になります。よろしければ具体的に教えていただけませんか?
yambejp

2022/04/04 04:20

最初に書いた通り「長文の一致をするなら普通にlikeやregexp」では回答になっていませんか? インデックスが効かないのは仕方ないでしょう 全文検索は言葉が単語単位である英語圏での実装ですから 擬似的に分割処理をしてキーワードをヒットさせること自体が高負荷なんです。 あえてやるならキーワード登録でしょう。
nikuatsu

2022/04/04 07:54 編集

そうですね、ご回答としては残念ながら…。 なぜなら質問は「一致」でなく「あいまい検索」だからです。 LIKEではある語を確定させねばなりません。 例えば「あいうえお」について「%いうえ%」なら検索できますが、「%いくえ%」ではできませんよね。(言うまでもありませんがここも「あいうえお」でなく「質問の長文」で捉えてください。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問