Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


12.9 全文検索関数

MATCH (col1,col2,...) AGAINST (expr [search_modifier])

search_modifier:
  {
       IN NATURAL LANGUAGE MODE
     | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
     | IN BOOLEAN MODE
     | WITH QUERY EXPANSION
  }

MySQL では、次のような全文インデックス設定および検索がサポートされています。

  • MySQL の全文インデックスは、型 FULLTEXT のインデックスです。

  • 全文インデックスは、InnoDB または MyISAM テーブルでのみ使用でき、CHARVARCHAR、または TEXT カラムにのみ作成できます。

  • FULLTEXT インデックスの定義は、テーブルの作成時に CREATE TABLE ステートメントで指定することも、あとで ALTER TABLE または CREATE INDEX を使用して追加することもできます。

  • データセットが大きい場合は、FULLTEXT インデックスが付いていないテーブルにロードしてから、そのあとでインデックスを作成した方が、既存のFULLTEXT インデックスが付いているテーブルにロードするよりも断然速いです。

全文検索は、MATCH() ... AGAINST 構文を使用して実行されます。MATCH() には、検索対象のカラム名をカンマで区切ったリストを指定します。AGAINST には、検索する文字列と、実行する検索のタイプを示すオプションの修飾子を指定します。検索文字列は、クエリー評価時に定数である文字列値にする必要があります。たとえば、テーブルカラムは、行ごとに異なる可能性があるため除外されます。

全文検索には、次の 3 つの種類があります。

  • 自然言語の検索では、検索文字列が人間の自然な言語でのフレーズ (フリーテキストのフレーズ) として解釈されます。特別な演算子はありません。ストップワードリストが適用されます。これらは、InnoDB 検索インデックスの場合は innodb_ft_enable_stopwordinnodb_ft_server_stopword_table、および innodb_ft_user_stopword_tableMyISAM 検索インデックスの場合は ft_stopword_file によって制御されます。詳細は、セクション12.9.4「全文ストップワード」を参照してください。

    IN NATURAL LANGUAGE MODE 修飾子が指定されている場合または修飾子がまったく指定されていない場合は、全文検索が自然言語検索になります。詳細は、セクション12.9.1「自然言語全文検索」を参照してください。

  • ブール検索では、特別なクエリー言語のルールを使用して検索文字列が解釈されます。文字列には、検索対象の単語が含まれます。また、一致する行に単語が存在しなければならない、または存在してはならないように、あるいは通常よりも単語の重みが高くまたは低くなるように、要件を指定する演算子を含めることもできます。特定の共通単語 (ストップワード) は、検索インデックスから省略され、検索文字列に存在しない場合は一致が行われません。IN BOOLEAN MODE 修飾子は、ブール検索を指定します。詳細は、セクション12.9.2「ブール全文検索」を参照してください。

  • クエリー拡張検索は、自然言語検索を改善したものです。自然言語検索を実行する際は、検索文字列が使用されます。その後、検索で返されたもっとも関連性の高い行からの単語が検索文字列に追加され、再度検索が実行されます。クエリーでは、2 回目の検索からの行が返されます。IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION または WITH QUERY EXPANSION 修飾子は、クエリー拡張検索を指定します。詳細は、セクション12.9.3「クエリー拡張を使用した全文検索」を参照してください。

FULLTEXT クエリーのパフォーマンスについては、セクション8.3.4「カラムインデックス」を参照してください。

InnoDB FULLTEXT インデックスの処理に関するより技術的な詳細は、セクション14.2.13.3「FULLTEXT インデックス」を参照してください。

全文検索上の制約については、セクション12.9.5「全文制限」に一覧表示されています。

myisam_ftdump ユーティリティーは、MyISAM 全文インデックスの内容をダンプします。これは、全文クエリーのデバッグ時に役立つことがあります。セクション4.6.2「myisam_ftdump — 全文インデックス情報の表示」を参照してください。


User Comments
User comments in this section are, as the name implies, provided by MySQL users. The MySQL documentation team is not responsible for, nor do they endorse, any of the information provided here.
  Posted by Carlos Dias on August 8, 2011
Basically this approach makes me think twice because of the next logical steps:
1- If your working in one table with a lot of records...each time the records are updated or new lines inserted the index must be (obviously)recreated ... if it's myisam ... @writing operations the table is locked...
2- I guess that the best approach towards this it's probably the logic of: when tables are huge ... not creating indexes for text search ... create cache@sql ...(cache@sql is one index!) ...

Somehow anticipating these problems ... like i write are not problems to ignore...

Why this is the best option... because if people use one file to log the last writing operations and compare it with the file that contains the results @cache(best approach ... cronjob!) ... it's only necessary to point to the file that contains the results@cache...

The logic of:If there are 500 000 000 of conjugations of words/phrases,etc what's the need of indexing everything if only 50 000 conjugations are used/seeked,etc ...

Regards,
Carlos


  Posted by Bradley Smith on February 21, 2012
Alan, instead of creating 80 different tables, one for each category, why not partition the table by the category so the records with that category would be grouped together within the partition and then your only searching within the specific category and more direct and faster route to the data you want to search?
  Posted by Nasser W on September 2, 2013
MySQL fulltext search works well for Arabic. Just make sure of the following where needed:

1. `COLLATION = utf8_unicode_ci` & `CHARACTER SET = utf8`. (Databases, Tables, and Columns).
2. Index words of 3 letters and more. This is Very Important for Arabic, `ft_min_word_len = 3` (see `show variables like "ft_%";`)
3. Check the version of MySQL (5.5 or 5.6), and Engine (InnoDb or MyIsam)
Sign Up Login You must be logged in to post a comment.