この記事では、次の側面から MySQL フルテキスト インデックスの基本知識を紹介します:
MySQL フルテキスト インデックスに関するいくつかの注意事項
フルテキスト インデックスの構文
いくつかの検索タイプの紹介
複数のタイプ 検索タイプの例
フルテキストインデックスに関するいくつかの注意事項
検索はフルテキストタイプのインデックス列で行う必要があり、match で指定された列はフルテキストで指定されている必要があります
のみ可能MyIsam タイプのテーブルのようにテーブル エンジンに適用できます (MySQL 5.6 以降は Innodb テーブル エンジンでも使用できます)
char、varchar、および text タイプの列にはフルテキスト インデックスのみを作成できます
通常のインデックスと同様、テーブルを定義するときに指定することもできますし、テーブルの作成後に追加または変更することもできます
大規模なレコードを挿入する場合、インデックスを使用せずにテーブルにデータを挿入してからインデックスを作成する方が、テーブルに挿入するよりもはるかに高速です。インデックス付きのデータテーブル
検索文字列は定数文字列である必要があります。テーブルの列名にすることはできません
検索レコードの選択性が 50% を超える場合、一致しないとみなされます (自然検索)
全文インデックスの検索構文
MATCH(列名1,列名2,…)AGAINST(検索文字列[検索修飾子])
で指定した列名1,2,… match は、フルテキスト インデックスを確立する際に指定された列名です。 以下の検索修飾子の説明は次のとおりです:
search_modifier:
{ IN NATURAL LANGUAGE MODE | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION | IN BOOLEAN MODE | WITH QUERY EXPANSION }
いくつかの検索タイプの紹介
上記の検索修飾子は、実際には 3 つのフルテキスト検索タイプを示しています。
自然言語モードで
はじめに: デフォルトの検索フォーム (検索修飾子を追加しないか、修飾子が自然言語モードになっています)
機能:
検索文字列内の文字は通常の文字に解析され、特別な文字列はありません意味
マスクされた文字リスト内の文字列が処理されます フィルタリング
レコードの選択性が 50% を超える場合、通常は不一致とみなされます。
返されたレコードは、レコードの関連性に従ってソートされ、表示されます
IN BOOLEAN MODE
概要: ブールモード検索 (検索修飾子がブールモードの場合)
特徴:
検索文字列内の特殊文字は次に従って解析されます特定のルールに従う 意味には、いくつかの論理的な意味ルールが適用されます。たとえば、特定の単語は出現する必要がある、または出現できないなどです。
このタイプの検索によって返されるレコードは、関連性によって並べ替えられません
WITH QUERY EXPANSION
はじめに: 実際に 2 つの自然検索を実行し、直接的な導入関係を持つレコードを返すことができる少し複雑な検索フォーム、クエリ拡張付きの自然言語モードでの修飾子、またはWITH QUERY EXPANSION 修飾子
特徴: このタイプの検索は、実際には間接検索機能を提供します。例: 特定の単語を検索すると、最初の単語が返されます。行には、検索語の文字列が含まれません。最初の検索結果のレコード語に基づいて 2 回目の照合を実行できるため、間接的な関係を持つ一致するレコードを見つけることができます。
いくつかの検索タイプの例
自然言語モード モードでのアプリケーション:
これは、名前フィールドに全文インデックスを確立した製品テーブルに引き続き適用されます。これは、関連するキーワードに一致する必要があるためです。 name 列 次のように
Sql ステートメントを記録します:
SELECT * FROM product WHERE match(name) against(‘auto')
時間は悪くなく、約 870,000 レコード中 10,000 レコード以上がヒットしましたが、効果は依然として良好です
注: デフォルトでは、すでに高値から高値までの相関に基づいています。レコードは最低レベルに返されます
product から match(name) between('auto') を選択して、レコードの相関値を表示できます。値は の間にあります。 0 と 1。0 はレコードが一致しないことを意味します
いくつかの重要な機能:
1. どの単語が無視されるか
デフォルトの全文インデックスでは 4 文字を超える単語が有効であると見なされます。構成内の ft_min_word_len を変更して構成できます。
語彙リスト内の単語を保護するためのデフォルトの全文インデックス 一部の一般的な単語は、あまりにも一般的であり意味的な効果がないためブロックされ、検索プロセスでは無視されます。 。もちろん、このリストは構成可能です。
2. 単語の分割を実行する方法
全文インデックスは、連続する有効な文字 (正規表現の w と一致する文字セット) を単語とみなし、「'」を含むこともできますが、2 つ連続することはできません。 '' は区切り記号とみなされます。その他の区切り文字: スペース、カンマ、ピリオドなど。
ブール モード モードのアプリケーション:
ブール マッチング モードでは、特殊な記号を追加して、検索プロセスの論理機能を強化できます。たとえば、公式 Web サイトで提供されている例 (mysql 文字列を含み、Yousql を含まないステートメントを検索する):
SELECT * FROM articles WHERE MATCH (title,body) -> AGAINST (‘+MySQL -YourSQL' IN BOOLEAN MODE);
検索をより詳細に制御でき、より「ハイエンド」に見えることがわかります。
実際、上記の操作にはいくつかの意味が含まれています:
プラス記号: and と同等
マイナス記号: not と同等
いいえ: or と同等
ブール型検索のいくつかの重要な機能を見てみましょう:
1. 50% のレコード選択制限はありません。検索結果レコードが全体の 50% を超えた場合でも、結果はレコードの関連性に従って自動的に並べ替えられません。 3. フルテキスト インデックスを作成せずに直接適用することもできますが、クエリが非常に遅くなるため、使用しないことをお勧めします。
4. 単語の長さの最小値と最大値をサポートします
5. マスクされた単語リストを適用します
ブール検索でサポートされる演算子:
n プラス記号 +: 変更された単語がレコード内に存在することを示します
n マイナス記号 -: 変更されたことを示します単語はレコード内に出現してはなりませんn 演算子なし: 単語はオプションですが、その単語を含むレコードの関連性は高くなります
n 二重引用符 ": フレーズを一致として使用します。例: "one word" は 1 つの単語と一致します
公式の例をいくつか示します:
少なくとも 1 つの単語を含むレコード
'apple Banana'
2 つの単語を含む必要があります
'+apple +juice'
macintosh を含む apple を含む必要があります レコードの関連性は非常に高い
'+apple macintosh'
を含むことはできません
apple を含む必要があり、macintosh と呼ぶことはできません
'+apple -macintosh'
apple で始まるレコードを検索します
'apple*'
一部の単語と完全に一致します word
'" some word"'