MySQL でより良い全文検索結果を取得する方法
著者: Techrepublic.com.com
2006-04-03 11:14:53
多数インターネット アプリケーションはすべて全文検索機能を提供しており、ユーザーは単語または単語の断片をクエリ項目として使用して、一致するレコードを見つけることができます。これらのプログラムはバックグラウンドで SELECT クエリの LIKE ステートメントを使用してこのクエリを実行しますが、この方法は機能しますが、特に大量のデータを処理する場合には非常に非効率な方法です。
MySQL は、組み込みの全文検索メソッドに基づいてこの問題の解決策を提供します。ここで開発者は、全文検索が必要なフィールドをマークするだけで、特殊な MySQL メソッドを使用してそれらのフィールドに対して検索を実行できます。これにより、パフォーマンスと効率が向上するだけでなく (MySQL はこれらのフィールドにインデックスを付けて検索を最適化するため)、より高品質な検索が可能になります。 MySQL は自然言語を使用して結果をインテリジェントに評価し、無関係な項目を排除するためです。
この記事では、MySQL で全文検索を実行する方法について説明します。
1. 基本テーブルを設定します
まず、次の SQL コマンドを使用してテーブルの例を作成します。
mysql> レビュー (id INT(5) PRIMARY) KEY NOT NULL AUTO_INCREMENT, data TEXT);
上記のコマンドは、単純な音楽アルバム データベース (主にテキスト全体) を作成し、このテーブルにいくつかのレコードを追加します。 `reviews` (`id`, `data`) VALUES
(1, 'Gingerboy は Throwing Rocks という新しいシングルをリリースしました。素晴らしいですね!');
mysql> reviews` (`id`, `data`) VALUES
(2, '皆さんこんにちは。マドンナの新しいシングルがとても気に入っています。
現在再生されている最もホットなトラックの 1 つ... '一日中聴いています');
mysql> INSERT INTO `reviews` (`id`, `data`)
VALUES (3, '新しいバンドを聞いたことがありますか?)地獄より熱い?
彼らはメンバーが 5 人いて、コンサートで演奏するときは楽器を燃やすんだよ!
>データが正しく入力されていることを確認します:
mysql> SELECT * FROM reviews; ----------------------
| データ-------------------
| ジンジャーボーイは
という新しいシングルをリリースしました | 、新しいマドンがとても好きです... |
| 新しいバンドを聞きましたか?
---- -------- -------------------------------- -------
セット内の 3 行 ( 0.00 秒)
2. 全文検索フィールドを定義します
次に、全文検索用にインデックスを作成するフィールドを定義します。 フィールド
mysql> ADD FULLTEXT INDEX (data);
クエリ OK、影響を受ける 3 行 (0.21 秒)
レコード: 3 重複: 0 警告: 0
SHOW INDEXES コマンドを使用して、インデックスが追加されていることを確認します:
mysql> SHOW INDEXES FROM reviews; --------- ---- ---------- - -------- ------ ------------ ---------
| パックされたテーブル| インデックスの種類 |
---------- ---- ---- ------ ------------ ---------
| レビュー ID | | はい |
--------- --------------- ---- ------ ------------ ---------
セット内の 2 行 (0.01 秒)
3. 全文検索を実行します。 >
データとインデックスがあれば、MySQL の全文検索を使用できます。最も単純な全文検索方法は、MATCH...AGAINST ステートメントを使用した SELECT クエリです。以下に含まれるレコードを検索する簡単な例を示します。単語「シングル」:
mysql> SELECT ID FROM レビュー (データ) AGAINST ('single') ----
id | ---
| 1 |
----
セット (0.00 秒) >ここで、MATCH() はパラメータとして渡されたフィールド内のテキストと AGAINST() に渡されたパラメータを比較し、一致する場合は通常の方法で戻ります。フィールドのリストをカンマで区切るだけで、複数のフィールドを MATCH() に渡すことができることに注意してください。
MySQL は全文検索リクエストを受け取ると、各レコードを内部でスコア付けします。一致しないレコードはスコア 0 を取得し、「関連性が高い」レコードは相対的に記録された「関連性が低い」レコードよりも高いスコアを取得します。より高いスコア。関連性は一連の MySQL 区別基準によって決定されます。詳細については、MySQL ユーザー マニュアルを確認してください。
各レコードのスコアを確認するには、以下に示すように、結果セットの一部として MATCH() メソッドを返すだけです。
mysql> SELECT id, MATCH (data) AGAINST ( 'ロック') レビューから;
---- ----------------------------------
| ID | MATCH (データ) AGAINST ('ロック') ---- ---- --------
| 1 |
2 | ------------------------
3 行セット (0.00 秒)
4. 論理検索修飾子を使用する(ブール検索修飾子)
特殊な IN BOOLEAN MODE 修飾子を AGAINST ステートメントに追加することで、論理検索修飾子を使用してより正確な検索を行うこともできます。これを実現するには、次の例では、「single」という単語を含むレコードをレコードに追加します。 「Madonna」は見つかりません:
mysql> SELECT ID FROM reviews WHERE MATCH (data) AGAINST ('single -madonna' IN BOOLEAN MODE); >
| id |
----
--- -
1 行 (0.00 秒)
この検索機能は通常、(完全な単語ではなく) 単語の断片を検索するために使用され、IN BOOLEAN MODE ステートメント * (アスタリスク) 演算子で使用できます。次の例は、" を含むレコードを検索する方法を示しています。ワード内:
mysql> SELECT ID FROM reviews WHERE MATCH (data) AGAINST ('hot*' IN BOOLEAN MODE); ----
| id |
----
| 3 |
----
セット (0.00 秒) 🎜>
このメソッドを使用して、AGAINST に渡される少なくとも 1 つのパラメーターを検索することもできます。次の例では、「hell」と「rocks」のいずれかのレコードを含む少なくとも 1 つの単語を検索します。 mysql> レビューから ID を選択 (データ) をブール モードで選択します。
--- -
| -
| 1 |
----
2 行 (0.00 秒)
上記の例は、次に次の記述が必要なときに、従来の SELECT...LIKE ステートメントと比較して全文検索を実行するより効率的な方法を示しています。MySQL データベース インターフェイスを検索するときにこの方法を試すことができます。