FULLTEXTインデックスをシングルカラムに付けたテーブルを作成して検索してみる。
FULLTEXTは2つ作成し、それぞれ別々の列に作成。

single_column_ft

CREATE TABLE `T_FULLTEXT` (
id int UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title varchar(100) NOT NULL,
body varchar(45) NOT NULL,
FULLTEXT (title),
FULLTEXT (body)
) ENGINE=MYISAM DEFAULT CHARSET=utf8;


INSERT INTO T_FULLTEXT (title,body) VALUES
('MySQL Tutorial','DBMS stands for DataBase ...'),
('How To Use MySQL Well','After you went through a ...'),
('Optimizing MySQL','In this tutorial we will show ...'),
('MySQL Tricks','1. Never run mysqld as root. 2. ...'),
('MySQL vs. MSSQL','In the following database comparison ...'),
('DBMS and MYSQL','MYSQL is Open Source database ...'),
('MySQL Security','When configured properly, MySQL ...');

single_column_ft_result

————————————————————————-
[制限事項など] ↓
————————————————————————-

50_percent

この例で、「MySQL」という言葉は少なくとも 50 % の行で提示されているため、
検索結果は空になります。このように,この言葉は効果的にストップワードとして扱われます。
大きなデータセットでは、これは最も望ましい動作です : 自然言語のクエリは、1GB テーブルの
毎 2 行目は戻さないようになっています。
小さなデータセットにとっては、これはあまり望ましい動作ではありません。

テーブルの行の半分にマッチする言葉は、関連のある資料を見つけるのに適しません。
事実、関連のないものも大量に検出されるでしょう。これはインターネットのサーチエンジン
での検索と同じ論理です。このため、この言葉を含む行は、この特定のデータセットにおいて
語義の値が低く定められています。あるデータセットでは、提示された単語が 50% の
境界値を越えても、他のデータセットではまた異なります。

50% の境界値は、全文検索を行うとその重要性が明らかになります : テーブルを作成し、
テキストの 1 行または 2 行のみをインサートしてみると、テキストのすべての単語は
少なくとも 50% の行に存在することが分かります。そのため、検出結果は検出されません。
少なくとも 3 行以上をインサートするようにしてください。

確かめる為に”MYSQL”という言葉を含まないデータを全体の50%以上Insertしてみて、
再度”MYSQL”という文言を含むデータを検索してみた。結果は全て表示されるようになった。

50_percent_rule

* 単語のあるものは、全文検索では無視されます :
* 短すぎる単語は無視されます。全文検索で検出される言葉で最も短いものは 4 文字です。
* ストップワード リストにある言葉は無視されます。ストップワードは 「the」 や 「some」 などの常用語で、
語義の値はゼロとされています。すでに組み込まれているストップワードのリストがありますが、
ユーザ定義リストで書き換えることができます。

11.7. 全文検索関数
11.7.3. 全文ストップワード
11.7.5. 微調整 MySQL 全文検索


全文検索関数

全文検索は MATCH() … AGAINST シンタックスを用いて行われます。MATCH() は、検索用にカラムに名称をつける、
カンマで区切られたリストを使用します。AGAINST は検索するストリングと、実行する検索のタイプを示すオプション
の修飾子を利用します。検索ストリングは、変数やカラム名ではなく、リテラル ストリングでなければなりません。
全文検索には3種類あります :

* ブール検索は、特別なクエリ言語のルールを使用した検索ストリングを解釈します。
ストリングは検索の対象になる言葉を含みます。また、単語は整合行で提示または不提示にされなければならない、
もしくは、通常より高く、または低く加重するべき、等の条件を指定する演算子も含むことができます。
「some」 や 「then」 のような一般的な単語はストップワードで、検索ストリングにあってもマッチしません。
IN BOOLEAN MODE 修飾子はブール検索を特定します。

* 自然言語の検索は、検索ストリングを人間の自然な言語でのフレーズ ( フリーテキストのフレーズ ) として解釈します。
これには特別な演算子はありません。ストップワード リストは適用されます。また、行の 50% 以上にある言葉は常用語と判断され、
検出はされません。全文検索は、IN NATURAL LANGUAGE MODE 修飾子が与えられている、または修飾子がまったくない場合は、
自然言語検索になります。

* クエリ拡張検索は、自然言語検索が改変されたものです。自然言語検索を行うには、
検索ストリングが使用されます。そして、検索によって返された最も関連性の強い行からの言葉が検索ストリングに加えられ、
再度検索されます。クエリは 2 度目の検索からの行を戻します。
IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION または WITH QUERY EXPANSION 修飾子は、クエリ拡張検索を特定します。

IN NATURAL LANGUAGE MODE および IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION 修飾子は、MySQL 5.1.7 から追加されました。

CREATE TABLE `TABLE100` (
  id int UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
  title   varchar(100) NOT NULL,
  body    varchar(45) NOT NULL,
  FULLTEXT (title,body)
) ENGINE=MYISAM DEFAULT CHARSET=utf8;

INSERT INTO TABLE100 (title,body) VALUES
('MySQL Tutorial','DBMS stands for DataBase ...'),
('How To Use MySQL Well','After you went through a ...'),
('Optimizing MySQL','In this tutorial we will show ...'),
('MySQL Tricks','1. Never run mysqld as root. 2. ...'),
('MySQL vs. MSSQL','In the following database comparison ...'),
('DBMS and MYSQL','MYSQL is Open Source database ...'),
('MySQL Security','When configured properly, MySQL ...');

fulltext

SELECT * FROM TABLE100
WHERE MATCH (title,body)
AGAINST ('DBMS' IN NATURAL LANGUAGE MODE);

SELECT LEFT(title,20),LEFT(body,20) FROM TABLE100
WHERE MATCH (title,body) AGAINST ('DBMS');

fulltext_2