2012-10-01 18 views
9

全文検索を利用するサイトを検索しています。検索自体は素晴らしいです、それは私の問題ではありません。私はユーザー提供のキーワード(MATCH ... AGAINST ...)をANDで連結し、複数の単語が結果をさらに狭めるようにします。今、特定のストップワードが索引付けされていないことを知っています。それは私にとっては本当に選択基準として使用したくないということです。しかし、ストップワードが(ユーザーによって)キーワードセットに提供された場合、単語が実際に特定のテキストブロック内にあっても(期待どおり)すべての結果が強制終了されます。クエリでmysqlの全文ストップワードを無視する

私の質問:特定の単語がクエリの時点でストップワードかどうかを確認する方法はありますか?私の好みの解決方法は、関連する単語を検索条件から除外することです(ユーザが単語「どちらも」で結果を絞り込むことができても気にしません。MySQLを空の結果セットに戻すことは望ましくありません。たとえどちらも結果に存在しないとしても、それを提供した)。あるいは、ストップワードリストを空にしなければならないのでしょうか?助けてくれてありがとう。

編集---- 申し訳ありませんが、実際にはこれを提供するコードスニペットはありません。コードは正常に動作します。それは私が扱っている論理的な問題です。しかし、一例として、説明のために:リンゴ、オレンジ、マンゴー、バナナ 2:ブドウ

は、語を含む(がこれらに限定されない)

1を3つのレコードが存在すると言うことができます、オレンジ、パイナップル、マンゴー 3:ジャガイモ、マンゴー、メロン、キーラナイトリー

ユーザーが入力した検索語がmangoの場合、すべての結果が正しく返されます。単語がオレンジでmangoの場合、結果1と2が返されます(正しく)。今、バナナがストップワードであるとしましょう(それはないが、それを前提としましょう)、オレンジ、マンゴ、バナナの検索の場合、結果は返されません(バナナは全文索引に含まれていないためです)。

私が探しているのは、他の誰かがこの問題に遭遇し、その問題を回避する方法がある場合です。並べ替え:

if 'banana' NOT STOP WORD match 'banana' against `words`. (OBVIOUSLY not real code). 

それとも...私はストップワードリストをドロップする必要がありますするつもりです...

+0

何を試しましたか?いくつかの例を教えていただけますか? – jcho360

+0

答えのどれも本当にあなたが探していたものを得ていないようです。あなたはいつでもあなたの質問からストップワード(と短すぎる単語)を手作業で除外するためのアプリケーションコードを書くことができます。それはおそらく私たちがやることです。 –

+0

2017と同じ問題があります。mysqlのフルテキスト検索は本当にうまく設計されておらず、基本機能が不足しているようです。 – jgr

答えて

9

あなたはすべてストップワードを比較することにより、キーワードを確認することができます。ここにはstopwordsのリストがあります。 私はフルテキストからストップワードを無効にする方法を見つけました。 あなただけ

ft_stopword_file = "" 

、.cnfのファイルを見つけ、これを追加する必要があり、再起動MySQLのエンジンとインデックスを再構築します。

希望MySQLで全文ストップワード無効にする方法この作品

+0

私はこれが私が行かなければならないルートかもしれないと思っていました。私は本当に他の誰かがもっと巧妙な解決策を持っていることを望んでいました。あなたのご意見ありがとうございます。 – dgeare

+0

私はうれしいです、それはあなたのために働きます:) –

3

:のmy.iniテキストファイル(MySQLの)で

を:あなたの最小長を設定

ft_stopword_file = "" or link an empty file "empty_stopwords.txt" 
ft_min_word_len = 2 

//しかし、注意してくださいその短い単語(3,2)は、特に全文索引付き列フィールドが大きい場合は、照会時間を劇的に増加させます。

ファイルを保存して、サーバーを再起動します。

次のステップは、このクエリを使用してインデックスを修復する必要があります:あなたのテーブルはInnoDBストレージエンジンを使用している場合

REPAIR TABLE tbl_name QUICK. 

しかし、これは動作しません。あなたはMyISAMテーブルにそれを変更する必要があります:

ALTER TABLE t1 ENGINE = MyISAM; 

だから、もう一度:

1. Edit my.ini file and save 
2. Restart your server (this cannot be done dynamically) 
3. Change the table engine (if needed) ALTER TABLE tbl_name ENGINE = MyISAM; 
4. Perform repair      REPAIR TABLE tbl_name QUICK. 

はInnoDBテーブルとMyISAMのは、その速度差を持っていることに注意してください。一つは、これは

1ステップ使用

+1

MySQL 5.6のInnoDBは全文索引を持っています。 –

1

(インターネット上でそれについての詳細を読む)より速く、より速くMySQLで全文検索のために無効にストップワードを他の書き込みを読む:MySQLでオープンmy.iniファイル

2:場所をサーバー

4を再起動します:使用してテーブルを修復するのmy.iniで[mysqldを]行(ファイルの[mysqldを]検索)

ft_min_word_len=1 
ft_stopword_file="" 

3の後に2行の下にコマンド以下

> repair table tablename; 

5:今、あなたの検索が働いている....

0

MATCHを使用してみてください... AGAINSTを... BOOLEAN MODE このIN 1と同様: WHERE MATCH(作者、タイトル) AGAINST(」 "BOOLEAN MODE"の "origin of");

+0

ストップワードは全文索引にはないので、ブールモードを使用しても戻りません何でも –

0

場合でも(このソリューションが動作します

(関連するテーブルを最適化した後、まだフルテキストインデックスに索引付けされていない単語を停止する)私はInnoDBテーブルとMySQL 5.6を使用しています、私のために動作しませんでした ft_stopword_file = ""
を設定すべてのユーザーの

CREATE TABLE mydb.stopwordslist(value VARCHAR(20)) ENGINE = INNODB; 
INSERT INTO mydb.stopwordslist(value) VALUES ('skipthisword'); 

あなたはまだ、スーパーユーザー権限を必要とする:あなたは)スーパユーザでない

SET GLOBAL innodb_ft_server_stopword_table = 'mydb/stopwordslist'; 
それがセッション変数であるとしてだけでユーザーのための

SET SESSION innodb_ft_user_stopword_table = 'mydb/stopwordslist'; 

(それをインデックスと更新の列を再作成するものを想定して)、それはあなたのセッションはとても閉じているとき、あなたがでそれを設定していることを確認してください続かないだろう各セッションまたはフルテキストインデックスを持つテーブルに最適化または挿入する前に、またはフルテキストインデックスでインデックスされた列を更新するとき

関連する問題