14

全文検索を利用したサイトの検索を作成しています。検索自体はうまく機能しますが、それは私の問題ではありません。ユーザー提供のキーワード(MATCH ... AGAINST ...)とANDをつなぎ合わせて、複数の単語で結果をさらに絞り込みます。今、私は特定のストップワードが索引付けされていないことを知っています、そしてそれは私にとっては問題ありません、私はそれらを選択基準として本当に使いたくありません。ただし、ストップワードが(ユーザーによって)キーワードセットに指定されている場合、その単語が実際に特定のテキストブロックにある場合でも、(予想どおりに)すべての結果が強制終了されます。

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

編集----申し訳ありませんが、これを提供するコードスニペットは実際にはありません。コードは正常に機能しますが、実際には期待どおりです。それは私が扱っている論理的な問題です。しかし、例として、説明の方法で:

単語を含む3つのレコードがあるとしましょう(ただし、これらに限定されません)

1:リンゴ、オレンジ、マンゴー、バナナ2:ブドウ、オレンジ、パイナップル、マンゴー3:ジャガイモ、マンゴー、メロン、キーラナイトレイ

ユーザーが入力した検索語がmangoの場合、すべての結果が正しく返されます。単語がオレンジとマンゴーの場合、結果1と2が(正しく)返されます。ここで、バナナがストップワードであるとしましょう(そうではありません...しかし、そうであると仮定しましょう)。検索がオレンジ、マンゴー、およびバナナの場合、結果は返されません(バナナは全文インデックスにないため)。

私が探しているのは、他の誰かがこの問題に遭遇し、それを回避する方法があるかどうかです。一種の:

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

または...ストップワードリストを削除する必要がありますか...

4

6 に答える 6

12

すべてのストップワードを比較することで、キーワードを確認できます。 これが、全文からストップワードを無効にする解決策を見つけたストップワードのリストです。.cnfファイルを見つけて、これを追加するだけです。

ft_stopword_file = ""

mysqlエンジンを再起動し、インデックスを再構築します。

この仕事を願っています

于 2012-10-01T18:49:30.760 に答える
3

MySQLでフルテキストストップワードを無効にする方法:

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

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

//最小の長さを設定しますが、単語(3,2)を短くすると、特にフルテキストのインデックス付き列フィールドが大きい場合に、クエリ時間が大幅に長くなることに注意してください。

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

次のステップは、このクエリを使用してインデックスを修復することです。

REPAIR TABLE tbl_name QUICK.

ただし、テーブルがInnoDBストレージエンジンを使用している場合、これは機能しません。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つはより速く書き込みます(インターネットでそれについてもっと読む)

于 2013-08-02T15:20:43.857 に答える
1

この手順を使用して、mysqlでの全文検索のストップワードを無効にします

1:mysqlでmy.iniファイルを開きます

2:my.iniの[mysqld]行の後の2行の下に配置します(ファイル内の[mysqld]を検索します)

ft_min_word_len=1
ft_stopword_file=""

3:サーバーを再起動します

4:以下のコマンドを使用してテーブルを修復します

 > repair table tablename;

5:検索が機能しています...

于 2013-12-18T07:46:38.680 に答える
1

INNODBの場合、インデックスを作成するときにstop_wordsを無効にすることができます。

SET @@SESSION.innodb_ft_enable_stopword = 'OFF';

create table foo
....
fulltext (search_col)

これにより、ストップワードを無効にしてフルテキストインデックスが作成されます。次のクエリを使用して確認できます。

SET GLOBAL innodb_ft_aux_table = 'schema/foo';
select * from information_schema.innodb_ft_config;

結果は次のようになります。 ここに画像の説明を入力してください

use_stopwordが0に設定されていることに注意してください。

use_stopwordsこのmysqlドキュメントページで検索してください。 とチェックアウトinnodb_ft_enable_stopword はこちら

于 2019-06-23T03:18:12.980 に答える
0

設定 ft_stopword_file = ""
が機能しませんでした。INNODBテーブルとMySQL5.6を使用しています(関連するテーブルを最適化した後も、ストップワードがフルテキストインデックスでインデックスに登録されていません)

このソリューションは機能します(スーパーユーザーでなくても):

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';

これはセッション変数であるため、セッションを閉じても持続しません。各セッションで設定するか、フルテキストインデックスを持つテーブルに最適化または挿入する前、またはフルテキストインデックスでインデックス付けされた列を更新する前に必ず設定してください。

于 2017-11-22T16:09:36.567 に答える
-3

MATCH…AGAINST…INBOOLEANMODEを使用してみてください次のようになります:WHERE MATCH(author、title)AGAINST('"origin of"' IN BOOLEAN MODE);

于 2014-06-16T09:55:02.580 に答える