網上查了一下,有兩種方法,第一種最土的方法:使用like語句第二種聽濤哥說用全文索引,就在網上搜一下: 如何在MySQL中獲得更好的全文檢索搜尋結果
很多互連網應用程式都提供了全文檢索搜尋功能,使用者可以使用一個詞或者詞語片斷作為查詢項目來定位匹配的記錄。在後台,這些程式使用在一個SELECT 查詢中的LIKE語句來執行這種查詢,儘管這種方法可行,但對於全文尋找而言,這是一種效率極端低下的方法,尤其在處理大量資料的時候。
mysql針對這一問題提供了一種基於內建的全文尋找方式的解決方案。在此,開發人員只需要簡單地標記出需要全文尋找的欄位,然後使用特殊的MySQL方法在那些欄位運行搜尋,這不僅僅提高了效能和效率(因為MySQL對這些欄位做了索引來最佳化搜尋),而且實現了更高品質的搜尋,因為MySQL使用自然 語言來智能地對結果評級,以去掉不相關的項目。
這篇文章將向您講述在MySQL中如何進行全文檢索搜尋。
在進行資料庫查詢時,有完整查詢和模糊查詢之分。
SELECT 欄位 FROM 表 WHERE 某欄位 Like 條件
其中關於條件,SQL提供了四種匹配模式:
1,%:表示任意0個或多個字元。可匹配任意類型和長度的字元,有些情況下若是中文,請使用兩個百分比符號(%%)表示。
比如 SELECT * FROM [user] WHERE u_name LIKE '%三%'
將會把u_name為“張三”,“張貓三”、“三腳貓”,“唐三藏”等等有“三”的記錄全找出來。
另外,如果需要找出u_name中既有“三”又有“貓”的記錄,請使用and條件
SELECT * FROM [user] WHERE u_name LIKE '%三%' AND u_name LIKE '%貓%'
若使用 SELECT * FROM [user] WHERE u_name LIKE '%三%貓%'
雖然能搜尋出“三腳貓”,但不能搜尋出合格“張貓三”。
2,_: 表示任意單個字元。匹配單個任一字元,它常用來限制運算式的字元長度語句:
比如 SELECT * FROM [user] WHERE u_name LIKE '_三_'
只找出“唐三藏”這樣u_name為三個字且中間一個字是“三”的;
再比如 SELECT * FROM [user] WHERE u_name LIKE '三__';
只找出“三腳貓”這樣name為三個字且第一個字是“三”的;
3,[ ]:表示括弧內所列字元中的一個(類似Regex)。指定一個字元、字串或範圍,要求所匹配對象為它們中的任一個。
比如 SELECT * FROM [user] WHERE u_name LIKE '[張李王]三'
將找出“張三”、“李三”、“王三”(而不是“張李王三”);
如 [ ] 內有一系列字元(01234、abcde之類的)則可略寫為“0-4”、“a-e”
SELECT * FROM [user] WHERE u_name LIKE '老[1-9]'
將找出“老1”、“老2”、……、“老9”;
4,[^ ] :表示不在括弧所列之內的單個字元。其取值和 [] 相同,但它要求所匹配對象為指定字元以外的任一個字元。
比如 SELECT * FROM [user] WHERE u_name LIKE '[^張李王]三'
將找出不姓“張”、“李”、“王”的“趙三”、“孫三”等;
SELECT * FROM [user] WHERE u_name LIKE '老[^1-4]';
將排除“老1”到“老4”,尋找“老5”、“老6”、……
5,查詢內容包含萬用字元時
由於萬用字元的緣故,導致我們查詢特殊字元“%”、“_”、“[”的語句無法正常實現,而把特殊字元用“[ ]”括起便可正常查詢。據此我們寫出以下函數:
function sqlencode(str)
str=replace(str,"[","[[]") '此句一定要在最前
str=replace(str,"_","[_]")
str=replace(str,"%","[%]")
sqlencode=str
end function
在查詢前將待查字串先經該函數處理即可。
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
+---------+---------------+--------+------+------------+---------+
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
+----+
3 rows in set (0.00 sec)
以上的這些例子示範了相對於傳統的SELECT...LIKE語句,進行全文檢索搜尋的更有效方法,當您下一次需要編寫MySQL資料庫搜尋介面的時候,您可以嘗試這一方法。 最終發現使用不了,原因是只有MyISAM引擎才支援全文索引,暈。好吧,還是用like進行搜尋。。。