本文目的
最近有個項目需要對數據進行搜索功能。采用的LAMP技術開發,所以自然想到了MySQL的全文檢索功能。現在將自己搜集的一些資料小結,作為備忘。
MySQL引擎
據目前查到的資料,只有MyISAM引擎支持全文檢索(full text index),查詢效率高。但是有局限,不支持事務和外鍵。
Innodb支持事務和外鍵,但是不支持全文檢索。所以,如果需要全文檢索的數據,需要使用MyISAM引擎創建表。
MySQL中文全文檢索
很遺憾,目前mysql不支持中文全文檢索。目前有兩種解決方案
- 方案1:使用mysql中文檢索插件,個人認為可控性較差,雖然使用方便,但是如果后期插件出現問題,比較難解決。優點就是前期工作量相對較小。
- 方案2:中文分詞+GB2312編碼:通過分詞將原文分隔開,然后轉成GB2312的二進制文本形式(如一個字,4個字節A623,這樣就可以搜索單個中文)。(轉成GB2312編碼是為了避免中英文混合搜索。mysql全文檢索最小長度默認4(ft_min_word_len)個字,中文是4個漢字,英文是4個字母。對於中文,基本上都是2子詞,所以設置ft_min_word_len為2,但英文中,2字的單詞一般沒有什么特殊意義,如‘is’,‘do’等,所以為了兼顧中英文語法習慣,將中文適當‘變長’,也就是轉成GB2312的可見形式編碼)
- 方案3:中文分詞,ft_min_word_len設置為2,調用'repair table your_table quick',修復索引。相比方案2,此方案較節省空間。對於主要使用中文的系統而言,此方案更佳。
創建全文索引
舉一個文章表(t_article)的例子,title和body作為列子,如下:
CREATE TABLE `t_article` ( `title` varchar(100) DEFAULT NULL, `body` text, FULLTEXT KEY `ft_title` (`title`), FULLTEXT KEY `ft_body` (`body`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
P.S.: 如果有個表已經創建了全文索引,想要查看創建語法,可以使用“SHOW CREATE TABLE talbe_name;”這條命令顯示表格的創建語句。
注意紅色高亮部分就是全文檢索的語法。刪除也很簡單,比如刪除title的全文索引,“ALTER TABLE t_article DROP INDEX ft_title;”。
使用SQL檢索
比如期望對body中的數據進行全文檢索,命令如下
SELECT title, MATCH(body) AGAINST('php and other key word') AS score
FROM t_article WHERE MATCH(body) AGAINST('php and other key word');
注意這里的score很重要,該值代表了關鍵字與文本的相關性,該值一般在0到1之間,但是也可能達到4或更多。
相關資料
- Using MySQL Full-text Searching
- How to drop this index in MySQL?
- 支持中文的MYSQL全文檢索
- MySQL Fulltext Search 使用方式
- Comparison of full text search engine - Lucene, Sphinx, Postgresql, MySQL?(PS: 個人理解全文檢索技術產品中,mysql輕量級,sphinx中量級,Lucence重量級)
- 通過MySQL全文搜索實現中文的相關搜索(PS: 講解了為什么需要將中文分詞后轉碼,作為全文檢索)
- 如何設置ft_min_word_len參數:http://www.tipandtrick.net/2008/how-to-change-mysql-fulltext-index-minimum-and-maximum-length-of-words/