MySQL は IN BOOLEAN MODE
修飾子を使用して、ブール全文検索を行うことができます。
mysql>SELECT * FROM articles WHERE MATCH (title,body)
->AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
+----+-----------------------+-------------------------------------+ | id | title | body | +----+-----------------------+-------------------------------------+ | 1 | MySQL Tutorial | DBMS stands for DataBase ... | | 2 | How To Use MySQL Well | After you went through a ... | | 3 | Optimizing MySQL | In this tutorial we will show ... | | 4 | 1001 MySQL Tricks | 1. Never run mysqld as root. 2. ... | | 6 | MySQL Security | When configured properly, MySQL ... | +----+-----------------------+-------------------------------------+
+
および
-
演算子は、その言葉が含まれるものを検索するか、含まれないものを検索するかを示します。従って、このクエリーは
「MySQL」
という単語を含むすべての行を引き出しますが、「YourSQL」
という単語は 含まれません 。
MySQL ではこの機能を実装するため、「暗黙的ブール論理」と呼ばれることのある、次のような特徴を備えた構文が使用されています。
+
は
AND
を表します
-
は
NOT
を表します
[演算子なし] は暗黙的に
OR
を表します
ブール全文検索は以下の特徴を持っています :
50% の境界値を用いません。
行を自動的に関連性の降順にソートすることはありません。先行のクエリーの結果からもこれが分かります : 最高の関連性を持つ行は、「MySQL」 を 2 度含んでいるものですが、最初でなく最後に挙げられています。
FULLTEXT
インデックスなしでも実行が可能ですが、その方法での検索は速度が極めて遅くなります。
全文パラメータの最小および最大の単語の長さの適用。
ストップワードリストは適用されます。
ブール全文検索の機能は次の演算子をサポートします :
+
頭にプラス記号が付くのは、その言葉が戻される各行に必ず含まれていなければならないことを示します。
-
頭にマイナス記号が付くのは、その言葉が戻される行のいずれにも絶対に含まれるべきでないことを示します。
注記 :-
演算子は、本来ならほかの検索語によって検出される行を除外するためだけのものです。従って、-
によって優先された検索語のみを含むブールモードの検索は、空の結果を返します。「除外された検索語を含むものをのぞいたすべての行」が返されるわけではありません。
(演算子なし)
デフォルトにより
(+
も
-
も指定されていない場合)
、その単語は任意になりますが、その語を含む行は上位に順位づけられます。これは、IN
BOOLEAN MODE
修飾子なしの
MATCH() ... AGAINST()
の動作を模倣しています。
> <
このふたつの演算子は、行にかけられた関連値への、単語の寄与度を変更します。>
演算子は寄与度を高め、<
は低めます。以下のリストに続く例を参照してください。
( )
丸括弧は単語を部分式にグループ分けします。丸括弧でまとめられたグループは入れ子になります。
~
頭につくチルダ (波型記号)
は否定演算子になり、行の関連性への単語の貢献が否定的になります。これは
「noise」
単語をマークするのに便利です。そのような単語を含む行は、ほかよりも低く順位づけられますが、-
演算子のように除外されることはありません。
*
アスタリスク (星印) は前方一致
(またはワイルドカード)
演算子として機能します。ほかの演算子とは異なり、単語に付加して影響をあたえます。*
の演算子を単語の前につければマッチします。
切り捨て演算子にストップワードや短すぎる単語を指定した場合、それらの単語はブールクエリーから削除されません。たとえば、'+word
+stopword*'
の検索で返される行はおそらく、'+word
+stopword'
の検索で返される行よりも少なくなります。前者のクエリーはそのまま使用されるので、ドキュメント内に
stopword*
が存在している必要があるからです。後者のクエリーは
+word
に変換されます。
"
二重引用符
(「"
」)
でフレーズを囲むと、そのフレーズそのもの
を持つ行のみにマッチします。フレーズを単語に分ける全文エンジンは、FULLTEXT
インデックスで、その単語を検索します。非言語文字は正確にマッチする必要があります。フレーズ検索は、そのフレーズとまったく同じ単語を同じ並びで含むマッチのみを必要とします。たとえば、"test
phrase"
は "test,
phrase"
とマッチします。
フレーズの単語がインデックスにある単語とマッチしない場合は、結果は空になります。例として、すべての単語がストップワードであったり、インデックスつき単語の必須の文字数に満たない場合などは、結果が空になります。
次の例はブール全文演算子を使用する検索文字列を、いくつかデモンストレートしたものです :
'apple banana'
ふたつの単語のうち、すくなくともひとつを含む行を検出。
'+apple +juice'
両方の語を含む行を検出。
'+apple macintosh'
単語 「apple」 を含む行を検出し、さらに 「macintosh」 を含んでいる場合は行を高く順位づける。
'+apple -macintosh'
単語 「apple」 を含み、「macintosh」 を含まない行を検出。
'+apple ~macintosh'
単語 「apple」
を含む行を検出するが、行が単語
「macintosh」
も含む場合は、含まないものよりも行を低く順位づける。これは、「macintosh」
が含まれると完全に除外される
'+apple -macintosh'
の検索より「柔らかい」。
'+apple +(>turnover
<strudel)'
「apple」 と 「turnover」 、または 「apple」 と 「strudel」 (順序は不問) を含む行を検出するが、「apple turnover」 を 「apple strudel」 より高く順序づける。
'apple*'
単語 「apple」 、「apples」 、「applesauce」 、または 「applet」 を含む行を検出。
'"some words"'
「some words」
とまったく同じフレーズを含む行を検出
(たとえば、「some words of wisdom」
を含む行は該当するが、「some noise
words」 は該当しない) 。フレーズを囲む
「"
」
文字は、フレーズを区切る演算子であることに注意。それらは検索文字列そのものを囲む引用符ではない。