MySQLでは,在布尔模式
修飾子を使用することでブル全文検索を実行できます。この修飾子を使用すると,検索文字列の先頭または末尾にある特定の文字が特別な意味を持ます。次のクエリでは,+
および-
演算子は,一致が発生するために単語が存在しなければならないことと,単語が存在してはならないことをそれぞれ示します。したがって,このクエリ,では,「MySQL」という単語は含まれるが,「YourSQL」という単語は含まれないすべての行が取得されます。
mysql> SELECT * FROM articles WHERE MATCH ('+ mysql -YourSQL' IN BOOLEAN MODE);+----+-----------------------+-------------------------------------+ | id | |头衔的身体 | +----+-----------------------+-------------------------------------+ | 1 | | DBMS代表数据库MySQL教程……在你经历了一个…优化MySQL在本教程中我们将展示…| | 4 | 1001 MySQL小技巧| 1。不要以root用户运行mysqld。2 .……| | 6 | MySQL Security |如果配置正确,MySQL…| +----+-----------------------+-------------------------------------+
この機能を実装すると,MySQLでは暗黙的ブル論理とも呼ばれる次のようなものが使用されます。
+
は和
を表します-
は不
を表します[演算子なしは暗黙的に
或
を表します
ブル全文検索には,次のような特徴があります。
行は自動的に関連性の降順にソトされません。
InnoDB
テブルでブルクエリを実行するには,匹配()
式のすべてのカラム上に全文
ンデックスが必要です。MyISAM
検索邮箱ンデックスに対するブ邮箱ルクエリ邮箱は,全文
ンデックスなしでも機能します。ただし,この方法で実行される検索の速度は,非常に遅くなります。単語の最小長および最大長の全文パラメタは,
InnoDB
検索邮箱ンデックスの場合はinnodb_ft_min_token_size
およびinnodb_ft_max_token_size
、MyISAM
検索邮箱ンデックスの場合はft_min_word_len
およびft_max_word_len
に適用されます。ストップワドリストが適用されます。これらは,
InnoDB
検索邮箱ンデックスの場合はinnodb_ft_enable_stopword
、innodb_ft_server_stopword_table
,およびinnodb_ft_user_stopword_table
、MyISAM
検索邮箱ンデックスの場合はft_stopword_file
によって制御されます。InnoDB
の全文検索では,“+ +苹果”
の例と同様に,単一の検索単語で複数の演算子を使用するようサポトされていません。MyISAMの全文検索では,同じ検索が正常に処理され、検索単語に隣接する演算子を除くすべての演算子が無視されます。InnoDB
の全文検索では、先頭のプラス記号またはマ。たとえば,InnoDB
では' +苹果'
がサポトされますが,“苹果+”
はサポトされていません。末尾にプラス記号またはマナス記号を指定すると,InnoDB
で構文エラがレポトされます。InnoDB
の全文検索では,ワ邮箱ルドカ,ド(' + *’
)を使用した先頭のプラス記号,プラス記号とマ“+ -”
)、または先頭のプラス記号とマ和ナス記号の組み合わせ(“+ -苹果”
)はサポトされていません。このような無効なクエリでは,構文エラが返されます。MyISAM
検索ンデックスに適用される50%のしきい値は使用されません。
ブル全文検索機能では,次の演算子がサポトされています。
+
先頭または末尾のプラス記号は,この単語が返される各行に存在しなければならないことを示します。
InnoDB
では,先頭のプラス記号のみがサポトされています。-
先頭または末尾のマナス記号は,この単語が返される行のいずれにも存在してはならないことを示します。
InnoDB
では、先頭のマ。注:
-
演算子は,本来ならほかの検索語句で一致が行われる行を除外することのみに使用します。したがって,-
の前にある検索語句のみを含むブルモドの検索では,空の結果が返されます。「除外された検索語句のいずれかを含む行を除いたすべての行」が返されるわけではありません。(演算子なし)
デフォルトでは(
+
と-
のどらも指定されてない場合)、この単語はオプションですが、それを含む行の評価は高くなります。これは,在布尔模式
修飾子なしの匹配()……对()
の動作と似ています。@
距离
この演算子は,
InnoDB
テブルでのみ機能します。2 .以上の単語がすべて,相互に指定された距離内で始まっているかどうかが単語単位でテストされます。@
演算子の直前に,二重引用符で囲まれた文字列内の検索単語を指定します(たとえば,距离
MATCH(col1) AGAINST('"word1 word2 word3" @8'在布尔模式)
)。> <
これらの2つの演算子は,行に割り当てられた関連性の値への単語の貢献度を変更する際に使用されます。
>
演算子は貢献度を上げ,<
演算子は貢献度を下げます。次のリストのあとに示す例を参照してください。( )
丸括弧は,単語を部分式にグルプ化します。丸括弧で囲まれたグルプはネストできます。
~
先頭のチルダは否定演算子として機能するため、行の関連性への単語の貢献度がマ以及ナスになります。これは,「ノイズ」単語にマクを付ける際に便利です。このような単語を含む行は,その他よりも低く評価されますが,
-
演算子を使用した場合のように,完全に除外されることはありません。*
アスタリスクは,切り捨て(またはワ,ルドカ,ド)演算子として機能します。その他の演算子とは異なり,影響を受ける単語に追加されます。
*
演算子の前の単語で始まれば,単語が一致します。切り捨て演算子を付けて単語が指定されている場合は,その単語が短すぎたり,ストップワードであったりしても,ブールクエリーから削除されません。単語が短すぎるかどうかは,
InnoDB
テブルの場合はinnodb_ft_min_token_size
設定、MyISAM
テブルの場合はft_min_word_len
によって判断されます。ワルドカド単語は,1。単語の最小長が4である場合は,'+
の検索では,2番目のクエリで短すぎる検索語句词
+ *’的
が無視されるため,'+
の検索よりも少ない行が返される可能性があります。词
+ '"
二重引用符 (「
"
」)文字内で囲まれたフレズは,入力されたそのままのフレズを含む行にのみ一致します。全文エンジンでは,フレ,ズが複数の単語に分割され,それらの単語の全文
ンデックス内で検索が実行されます。単語以外の文字は、正確に一致する必要がありません。フレーズ検索では、そのフレーズとまったく同じ単語が同じ順序で一致に含まれることのみが必要です。たとえば、“测试“
は“测试,“
と一致します。フレズにンデックス内にある単語が含まれない場合は,結果が空になります。単語がテキスト内に存在しない場合、ストップワードである場合、またはインデックス付きの単語の最小長よりも短い場合の組み合わせが原因で、単語がインデックス内に存在しない可能性があります。
次の例では,ブル全文演算子を使用する一部の検索文字列を実演します。
“香蕉苹果”
2 emmの単語の1 emm以上を含む行を検索します。
“+苹果+果汁”
両方の単語を含む行を検索します。
' +苹果麦金塔电脑的
単語「苹果」を含む行を検索しますが,行に「麦金塔电脑」も含まれる場合は行を高く評価されます。
' +苹果麦金托什
単語「苹果」を含むが,「麦金塔电脑」は含まない行を検索します。
“+苹果macintosh ~”
単語「苹果」を含む行を検索しますが,行に単語「麦金塔电脑」も含まれる場合は,行に含まれない場合よりも低く評価されます。これは,「麦金塔电脑」が存在すると,行がまったく返されない
' +苹果麦金托什
の検索よりも「ソフト」です。' +苹果+(营业额> <点心)'
単語「苹果」と「营业额」,または「苹果」と「点心」(順序は不問)を含む行を検索しますが,「苹果公司的营业额」を「苹果馅饼」よりも高く評価します。
“苹果”
「苹果」、「苹果」、「苹果酱」、「小应用程序」などの単語を含む行を検索します。
“有些字”的
「一些单词」とまったく同じフレズを含む行を検索します(たとえば,「智慧之言」を含む行は検索しますが,「一些噪音的话」は検索しません)。
注記フレズを囲む「
"
」文字は,フレズを区切る演算子文字です。検索文字列自体を囲む引用符ではありません。
InnoDB
の全文検索は,斯芬克斯の全文検索エンジンをモデルにし,使用されるアルゴリズムは,BM25およびTF-IDFのランキングアルゴリズムに基づいています。このような理由のため,InnoDB
のブル全文検索の関連性ランキングは,MyISAM
の関連性ランキングと異なる場合があります。
InnoDB
では,「术语频率-反文档频率」(TF-IDF
)重み付けシステムの偏差を使用して,指定された全文検索クエリーのドキュメントの関連性にランクが付けられます。TF-IDF
の重み付けは,ドキュメントで単語が出現する頻度に基づき,コレクション内のすべてのドキュメントで単語が出現する頻度によってオフセットされます。言い換えると,ある単語がドキュメントで出現する頻度が高くなるほど,その単語がドキュメントコレクションで出現する頻度が低くなり,ドキュメントのランクが高くなります。
関連性ランキングの計算方法
単語の出現頻度(特遣部队
)値は,単語がドキュメントで出現する回数です。単語の逆文書頻度(以色列国防军
)値は,次の公式を使用して計算されます。ここで,total_records
はコレクション内のレコド数,matching_records
は検索語句が表示されるレコド数です。
${IDF} = log10(${total_records} / ${matching_records})
ドキュメントに単語が複数回含まれる場合は,idf値がtf値で乗算されます。
$ {TF} * $ {IDF}
特遣部队
および以色列国防军
値を使用する場合は,ドキュメントの関連性ランキングが次の公式を使用して計算されます。
${rank} = ${TF} * ${IDF} * ${IDF}
公式にいては,次の例で実演されています。
単一単語検索の関連性ランキング
この例では,単一単語検索の関連性ランキングの計算を実演します。
CREATE TABLE articles (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT, FULLTEXT (title,body))查询OK, 0行影响(1.04秒)mysql> INSERT INTO articles (title,body) VALUES(“mysql教程”,“这个数据库教程……”),(“如何使用mysql”,“在您通过了一个……”),(“优化您的数据库”,“在这个数据库教程……”),(“mysql vs. YourSQL”,“当比较数据库……”),(“mysql安全”,“当正确配置时,mysql……”),(“数据库,数据库,数据库”,“数据库数据库”),(“1001个mysql技巧”,“1。不要以root用户运行mysqld。2. ...'), ('MySQL全文索引','MySQL全文索引使用..');查询OK, 8行影响(0.06秒)记录:8重复:0警告:0 mysql> SELECT id, title,body, MATCH (title,body) AGAINST ('database' IN BOOLEAN MODE) AS score FROM articles ORDER BY score DESC;+----+------------------------------+-------------------------------------+---------------------+ | id身体标题| | |得分 | +----+------------------------------+-------------------------------------+---------------------+ | 6 |数据库,数据库,数据库|数据库数据库数据库| 1.0886961221694946 | | 3 |优化您的数据库|在这个数据库教程…| 0.36289870738983154 | | 1 | MySQL教程|数据库教程…| 0.18144935369491577 | | 2 |如何使用MySQL |当你通过了一个…| 0 | | 4 | MySQL vs. YourSQL || 0 | | 5 | MySQL Security |如果配置正确,MySQL… | 0 | | 7 | 1001 MySQL Tricks | 1. Never run mysqld as root. 2. ... | 0 | | 8 | MySQL Full-Text Indexes | MySQL fulltext indexes use a .. | 0 | +----+------------------------------+-------------------------------------+---------------------+ 8 rows in set (0.00 sec)
合計で8のレコドがあり,そのう3が「数据库」という検索語句に一致します。1 .目のレコド(id 6
)には,検索語句が6回含まれ,関連性ランキングは1.0886961221694946
です。このランキング値は,6の特遣部队
値(レコド)id 6
には「数据库」という検索語句が6回出現します),および次のように計算されのる0.42596873216370745以色列国防军
値(ここで8はレコードの合計数,3は検索語句が出現するレコードの数)を使用して計算されます。
${IDF} = log10(8 / 3) = 0.42596873216370745
その後,特遣部队
および以色列国防军
値はランキング公式に入力されます。
${rank} = ${TF} * ${IDF} * ${IDF}
MySQLコマンド行クライアントで計算を実行すると,1.088696164686938のランキング値が返されます。
mysql >选择6 * log10 (8/3) * log10 (8/3);+-------------------------+ | 6 * log10 (8/3) * log10 (8/3 ) | +-------------------------+ | 1.088696164686938 | +-------------------------+ 1行集(0.00秒)
选择……比赛……反对
ステトメントとMySQLコマンド行クラアントで返されるランキング値(1.0886961221694946
と1.088696164686938
)に,わずかな相違がある場合があります。この相違は,整数と浮動小数点/倍精度間のキャストが(関連する精度および丸めの決定とともに)InnoDB
によって内部で実行される方法,およびその他の場所(MySQLコマンド行クライアントやその他のタイプの計算機など)で実行される方法が原因で発生します。
複数単語検索の関連性ランキング
この例では,以前の例で使用された文章
テブルおよびデタに基づいて,複数単語の全文検索の関連性ランキングの計算を実演します。
複数の単語で検索する場合は,次の公式に示すように,関連性ランキングの値が各単語の関連性ランキングの合計になります。
${排名}= $ {TF} * $ {IDF} * $ {IDF} + $ {TF} * $ {IDF} * $ {IDF}
2 .の語句('mysql教程')で検索を実行すると,次の結果が返されます。
mysql> SELECT id, title,body, MATCH (title,body) AGAINST ('mysql教程' IN BOOLEAN模式)AS score FROM articles ORDER BY score DESC;+----+------------------------------+-------------------------------------+----------------------+ | id身体标题| | |得分 | +----+------------------------------+-------------------------------------+----------------------+ | 1 | |这个数据库MySQL教程教程……| 0.7405621409416199 | | 3 |优化您的数据库|在本数据库教程中…| 0.3624762296676636 | | 5 | MySQL Security |如果配置正确,MySQL…| 0.031219376251101494 | | 8 | MySQL全文索引| MySQL全文索引使用a ..| 0.031219376251101494 | | 2 |如何使用MySQL |当你通过一个…| 0.015609688125550747 | | 4 | MySQL vs. YourSQL |当比较数据库…| 0.015609688125550747 | | 7 | 1001 MySQL小技巧|不要以root用户运行mysqld。2 .…… | 0.015609688125550747 | | 6 | Database, Database, Database | database database database | 0 | +----+------------------------------+-------------------------------------+----------------------+ 8 rows in set (0.00 sec)
1 .目のレコド(id 8
)では,'mysql'が1回出現し,'tutorial'が2回出現します。mysql的に一致するレコードは6つ,“教程”に一致するレコードは2つあります。MySQLコマンド行クライアントでは、これらの値を複数単語検索のランキング公式に挿入するときに、予期されるランキング値が返されます。
mysql >选择(1 * log10 (8/6) * log10 (8/6)) + (2 * log10 (8/2) * log10 (8/2));+-------------------------------------------------------+ | ( 1 * log10 (8/6) * log10 (8/6)) + (2 * log10 (8/2) * log10 (8/2 )) | +-------------------------------------------------------+ | 0.7405621541938003 | +-------------------------------------------------------+ 1行集(0.00秒)
上記の例では,选择……比赛……反对
ステートメントとMySQLコマンド行クライアントで返されるランキング値に,わずかな相違があることについて説明しました。