MySQL の全文検索機能には、ユーザーが調整できるパラメータがほとんどありません。一部の変更でソースコードを変更する必要があるために、MySQL ソース配布を持っている場合は、全文検索の動作をさらに制御できます。セクション2.9「ソースから MySQL をインストールする」を参照してください。
全文検索の有効性は、慎重に調整されます。ほとんど場合、デフォルトの動作を変更すると、実際には有効性が低くなる可能性があります。使用方法を理解していない場合は、MySQL ソースは変更しないでください。
このセクションで説明するほとんどの全文変数は、サーバーの起動時に設定する必要があります。変更するには、サーバーの再起動が必要です。サーバーが動作しているときは、変更できません。
一部の変数を変更するには、テーブル内の
FULLTEXT
インデックスを再構築する必要があります。これを行う手順については、このセクションの後半で説明します。
インデックスが付けられる単語の最小長および最大長は、InnoDB
検索インデックスの場合は
innodb_ft_min_token_size
および
innodb_ft_max_token_size
、MyISAM
検索インデックスの場合は
ft_min_word_len
および
ft_max_word_len
で定義されます。これらのオプションのいずれかを変更したら、変更を有効にするために
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
には同等の設定がありません。)この変数はサーバーの実行中に変更できますが、そのためには
SUPER
権限を持っている必要があります。この場合は、インデックスを再構築する必要はありません。この変数を設定する方法を制御するルールについては、セクション5.1.4「サーバーシステム変数」を参照してください。
次のリストで説明するように、単語文字とみなされる文字セットは複数の方法で変更できます。変更が完了したら、任意の
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.3.1「文字定義配列」を参照してください。インデックス付きのカラムで使用される文字セットに新しい照合順序を追加し、その照合順序が使用されるようにカラムを変更します。照合順序の追加に関する一般的な情報については、セクション10.4「文字セットへの照合順序の追加」を参照してください。全文インデックス作成に固有の例については、セクション12.9.7「全文インデックス作成用の照合順序の追加」を参照してください。
インデックス作成に影響を与える全文変数
(innodb_ft_min_token_size
、innodb_ft_max_token_size
、innodb_ft_server_stopword_table
、innodb_ft_user_stopword_table
、innodb_ft_enable_stopword
)
を変更する場合は、変更したあとに
FULLTEXT
インデックスを再構築する必要があります。innodb_ft_min_token_size
および
innodb_ft_max_token_size
変数は動的に設定できないため、変更するにはサーバーを再起動し、インデックスを再構築する必要があります。
InnoDB
テーブルの FULLTEXT
インデックスを再構築するには、DROP
INDEX
および ADD INDEX
オプションを付けて ALTER
TABLE
を使用して、各インデックスを削除してから再作成します。
全文インデックス付きのテーブル上で
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
演算が終了した場所から続行されます。
インデックス作成に影響を与える全文変数
(ft_min_word_len
、ft_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_len
、ft_max_word_len
、および
ft_stopword_file
値を指定します。たとえば、単語の最小長を 3
に設定した場合は、次のように
myisamchk
を使用してテーブルを修復できます。
shell> 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
TABLE
、ANALYZE
TABLE
、OPTIMIZE
TABLE
、または ALTER
TABLE
ステートメントを使用します。これらのステートメントは、適切に使用される全文パラメータ値が認識されているサーバーで実行されます。