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