MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む

このページは機械翻訳したものです。

12.10.6 MySQL の全文検索の微調整

MySQL の全文検索機能には、ユーザーが調整できるパラメータがほとんどありません。 一部の変更でソースコードを変更する必要があるために、MySQL ソース配布を持っている場合は、全文検索の動作をさらに制御できます。 セクション2.9「ソースから MySQL をインストールする」を参照してください。

全文検索の有効性は、慎重に調整されます。 ほとんど場合、デフォルトの動作を変更すると、実際には有効性が低くなる可能性があります。 使用方法を理解していない場合は、MySQL ソースは変更しないでください

このセクションで説明するほとんどの全文変数は、サーバーの起動時に設定する必要があります。 変更するには、サーバーの再起動が必要です。サーバーが動作しているときは、変更できません。

一部の変数を変更するには、テーブル内の FULLTEXT インデックスを再構築する必要があります。 これを行う手順については、このセクションの後半で説明します。

単語の最小長と最大長の構成

インデックスが付けられる単語の最小長および最大長は、InnoDB 検索インデックスの場合は innodb_ft_min_token_size および innodb_ft_max_token_sizeMyISAM 検索インデックスの場合は ft_min_word_len および ft_max_word_len で定義されます。

注記

単語の最小長および最大長の全文パラメータは、ngram パーサーを使用して作成された FULLTEXT インデックスには適用されません。ngram トークンサイズは、ngram_token_size オプションで定義されます。

これらのオプションのいずれかを変更したら、変更を有効にするために FULLTEXT インデックスを再構築してください。 たとえば、2 文字の単語を検索可能にするには、オプションファイルに次の行を配置します。

[mysqld]
innodb_ft_min_token_size=2
ft_min_word_len=2

次に、サーバーを再起動し、FULLTEXT インデックスを再構築します。 MyISAM テーブルについては、MyISAM の全文インデックスを再構築する際に従う手順で、myisamchk に関する備考に注意してください。

自然言語検索のしきい値の構成

MyISAM 検索インデックスでは、選択された特定の重み付けスキームによって、自然言語検索で 50% のしきい値が決定されます。 これを無効にするには、storage/myisam/ftdefs.h で次の行を検索してください。

#define GWS_IN_USE GWS_PROB

この行を次のように変更します。

#define GWS_IN_USE GWS_FREQ

次に、MySQL を再コンパイルします。 この場合、インデックスを再構築する必要はありません。

注記

このように変更すると、MATCH() 関数に適切な関連性値を提供する MySQL の能力が大幅に低下します。 このような一般的な単語を検索する必要がある場合は、代わりに、50% のしきい値に従わない IN BOOLEAN MODE を使用して検索する方が適切です。

ブール全文検索演算子の変更

MyISAM テーブル上でブール全文検索に使用される演算子を変更するには、ft_boolean_syntax システム変数を設定します。 (InnoDB には同等の設定がありません。) この変数は、サーバーの実行中に変更できますが、グローバルシステム変数を設定するのに十分な権限が必要です (セクション5.1.9.1「システム変数権限」 を参照)。 この場合は、インデックスを再構築する必要はありません。

文字セットの変更

組込み全文パーサーでは、次のリストで説明するように、単語文字とみなされる文字のセットをいくつかの方法で変更できます。 変更が完了したら、任意の FULLTEXT インデックスを含むテーブルごとにインデックスを再構築します。 ハイフン文字 (' - ') を単語文字として処理すると仮定します。 次の方法のいずれかを使用します。

  • MySQL ソースを変更します。storage/innobase/handler/ha_innodb.cc (InnoDB の場合) または storage/myisam/ftdefs.h (MyISAM の場合) で、true_word_char() および misc_word_char() マクロを参照してください。 それらのマクロのいずれかに '-' を追加し、MySQL を再コンパイルします。

  • 文字セットファイルを変更します。再コンパイルする必要はありません。 true_word_char() マクロでは、英数字とその他の文字を区別するために character type テーブルが使用されます。 文字セット XML ファイルのいずれかで <ctype><map> 配列の内容を編集すると、'-'英字になるように指定できます。 次に、FULLTEXT インデックスに指定された文字セットを使用します。 <ctype><map> 配列の書式については、セクション10.13.1「文字定義配列」を参照してください。

  • インデックス付きのカラムで使用される文字セットに新しい照合順序を追加し、その照合順序が使用されるようにカラムを変更します。 照合順序の追加に関する一般的な情報については、セクション10.14「文字セットへの照合順序の追加」を参照してください。 全文インデックス作成に固有の例については、セクション12.10.7「全文インデックス付けのためのユーザー定義照合の追加」を参照してください。

InnoDB 全文インデックスの再構築

変更を有効にするには、次の全文インデックス変数のいずれかを変更した後に FULLTEXT インデックスを再構築する必要があります: innodb_ft_min_token_size; innodb_ft_max_token_size; innodb_ft_server_stopword_table; innodb_ft_user_stopword_table; innodb_ft_enable_stopword; ngram_token_sizeinnodb_ft_min_token_sizeinnodb_ft_max_token_size または ngram_token_size を変更するには、サーバーを再起動する必要があります。

InnoDB テーブルの FULLTEXT インデックスを再構築するには、DROP INDEX および ADD INDEX オプションを指定して ALTER TABLE を使用し、各インデックスを削除して再作成します。

InnoDB 全文インデックスの最適化

全文インデックス付きのテーブル上で OPTIMIZE TABLE を実行すると、全文インデックスが再構築され、削除済みのドキュメント ID が削除され、同じ単語に対応する複数のエントリが連結されます (可能な場合)。

全文インデックスを最適化するには、innodb_optimize_fulltext_only を有効にして、OPTIMIZE TABLE を実行します。

mysql> set GLOBAL innodb_optimize_fulltext_only=ON;
Query OK, 0 rows affected (0.01 sec)

mysql> OPTIMIZE TABLE opening_lines;
+--------------------+----------+----------+----------+
| Table              | Op       | Msg_type | Msg_text |
+--------------------+----------+----------+----------+
| test.opening_lines | optimize | status   | OK       |
+--------------------+----------+----------+----------+
1 row in set (0.01 sec)    

大きなテーブルで全文インデックスの再構築時間が長くなることを回避するには、innodb_ft_num_word_optimize オプションを使用すれば、最適化を段階的に実行できます。 innodb_ft_num_word_optimize オプションでは、OPTIMIZE TABLE が実行されるたびに最適化される単語の数が定義されます。 デフォルト設定は 2000 です。これは、OPTIMIZE TABLE が実行されるたびに 2000 個の単語が最適化されることを表します。 後続の OPTIMIZE TABLE 演算は、先行する OPTIMIZE TABLE 演算が終了した場所から続行されます。

MyISAM 全文インデックスの再構築

インデックス作成に影響を与える全文変数 (ft_min_word_lenft_max_word_len、または ft_stopword_file) を変更する場合や、ストップワードファイル自体を変更する場合は、変更して、サーバーを再起動したあとに、FULLTEXT インデックスを再構築する必要があります。

MyISAM テーブルの FULLTEXT インデックスを再構築するには、QUICK 修復演算を実行すれば十分です。

mysql> REPAIR TABLE tbl_name QUICK;

または、先ほど説明した ALTER TABLE を使用します。 これは、修復演算よりも高速になる可能性もあります。

任意の FULLTEXT インデックスを含む各テーブルは、上記のように修復する必要があります。 そうしないと、テーブルのクエリーによって誤った結果が生成される可能性があり、テーブルを変更すると、サーバーはテーブルが破損していて修復が必要であることを確認します。

myisamchk を使用して、MyISAM テーブルインデックスを変更する演算 (修復や分析など) を実行する場合は、ほかに指定がなければ、単語の最小長、単語の最大長、およびストップワードファイルのデフォルトの全文パラメータ値を使用して、FULLTEXT インデックスが再構築されます。 これにより、クエリーに失敗する可能性があります。

この問題は、これらのパラメータがサーバーでのみ認識されていることが原因で発生します。 MyISAM インデックスファイルには格納されていません。 サーバーで使用される単語の最小長や最大長、またはストップワードファイルの値を変更した場合の問題を回避するには、mysqld で使用される myisamchk と同じ ft_min_word_lenft_max_word_len、および ft_stopword_file 値を指定します。 たとえば、単語の最小長を 3 に設定した場合は、次のように myisamchk を使用してテーブルを修復できます。

myisamchk --recover --ft_min_word_len=3 tbl_name.MYI

myisamchk およびサーバーで全文パラメータに必ず同じ値が使用されるようにするには、オプションファイルの [mysqld][myisamchk] の両方のセクションにそれぞれを配置してください。

[mysqld]
ft_min_word_len=3

[myisamchk]
ft_min_word_len=3

MyISAM テーブルインデックスの変更に myisamchk を使用する方法の代替として、REPAIR TABLEANALYZE TABLEOPTIMIZE TABLE、または ALTER TABLE ステートメントを使用します。 これらのステートメントは、適切に使用される全文パラメータ値が認識されているサーバーで実行されます。