如何在MySQL中獲得更好的全文檢索搜尋結果
作者: 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, 'Gingerboy has a new single out called Throwing Rocks. It's great!');
mysql> INSERT INTO `reviews` (`id`, `data`) VALUES
(2, 'Hello all, I really like the new Madonna single.
One of the hottest tracks currently playing...I've been listening to it all day');
mysql> INSERT INTO `reviews` (`id`, `data`)
VALUES (3, 'Have you heard the new band Hotter Than Hell?
They have five members and they burn their instruments when they play in concerts.
These guys totally rock! Like, awesome, dude!');
驗證資料的正確錄入:
mysql> SELECT * FROM reviews;
+----+--------------------------------------------+
| id | data |
+----+--------------------------------------------+
| 1 | Gingerboy has a new single out called ... |
| 2 | Hello all, I really like the new Madon ... |
| 3 | Have you heard the new band Hotter Than... |
+----+--------------------------------------------+
3 rows in set (0.00 sec)
2、定義全文檢索搜尋欄位
接下來,定義您要作為全文檢索搜尋索引的欄位
mysql> ALTER TABLE reviews ADD FULLTEXT INDEX (data);
Query OK, 3 rows affected (0.21 sec)
Records: 3 Duplicates: 0 Warnings: 0
使用SHOW INDEXES命令來檢查索引已經被添加了:
mysql> SHOW INDEXES FROM reviews;
+---------+---------------+--------+------+------------+---------+
| Table | Column_name | Packed | Null | Index_type | Comment |
----------+---------------+--------+------+------------+---------+
| reviews | id | NULL | | BTREE | |
| reviews | data | NULL | YES | FULLTEXT | |
+---------+---------------+--------+------+------------+---------+
2 rows in set (0.01 sec)
3、運行全文檢索搜尋
當您擁有了資料和索引,就可以使用MySQL的全文檢索搜尋了,最簡單的全文檢索搜尋方式是帶有MATCH...AGAINST語句的SELECT查詢,以下是一個簡單的例子,可以來尋找含有單詞“single”的記錄:
mysql> SELECT id FROM reviews WHERE MATCH (data) AGAINST ('single');+----+
| id |
+----+
| 1 |
| 2 |
+----+
2 rows in set (0.00 sec)
在此,MATCH()將作為參數傳遞給它的欄位中的文字與傳遞給AGAINST()的參數進行比較,如果有匹配的,那就按照正常的方式返回。注意您可以傳遞不止一個欄位用MATCH()來查看-只需用逗號來分割欄位列表。
當MySQL收到了一個全文檢索搜尋的請求,它就在內部對每個記錄進行評分,不匹配的記錄得分為零,而“更相關”的記錄會得到比“不太相關”的記錄相對更高的分數。相關性是由MySQL的一系列區分標準來決定的,查看MySQL的使用者手冊可以得到更多的資訊。
想看到每個記錄的評分如何,只需要返回MATCH()方法作為結果集的一部分,如下所示:
mysql> SELECT id, MATCH (data) AGAINST ('rock') FROM reviews;
+----+-------------------------------+
| id | MATCH (data) AGAINST ('rock') |
+----+-------------------------------+
| 1 | 0 |
| 2 | 0 |
| 3 | 1.3862514533815 |
+----+-------------------------------+
3 rows in set (0.00 sec)
4、使用邏輯搜尋修飾符(Boolean search modifiers)
您還可以使用邏輯搜尋修飾符來進行更精確的搜尋,這通過在AGAINST語句中添加特殊的IN BOOLEAN MODE修飾符來實現,在以下的例子中,將尋找含有單詞“single”但是沒有“Madonna”的記錄:
mysql> SELECT id FROM reviews WHERE MATCH (data) AGAINST ('+single -madonna' IN BOOLEAN MODE);
+----+
| id |
+----+
| 1 |
+----+
1 row in set (0.00 sec)
這一搜尋特性通常用於搜尋單詞片斷(而不是完整的詞語),這可以通過在IN BOOLEAN MODE語句中的*(星號)操作符來實現,以下的例子展示了如何尋找單詞中含有“hot”的記錄:
mysql> SELECT id FROM reviews WHERE MATCH (data) AGAINST ('hot*' IN BOOLEAN MODE);+----+
| id |
+----+
| 3 |
| 2 |
+----+
2 rows in set (0.00 sec)
您還可以使用這種方法來尋找至少一個傳遞到AGAINST的參數中,以下的例子尋找了至少包含單詞“hell”和“rocks”中的一個的記錄:
mysql> SELECT id FROM reviews WHERE MATCH (data) AGAINST ('hell rocks' IN BOOLEAN MODE);
+----+
| id |
+----+
| 1 |
| 3 |
+----+
2 rows in set (0.00 sec)
以上的這些例子示範了相對於傳統的SELECT...LIKE語句,進行全文檢索搜尋的更有效方法,當您下一次需要編寫MySQL資料庫搜尋介面的時候,您可以嘗試這一方法。