MySQL全文檢索初探


本文目的

最近有個項目需要對數據進行搜索功能。采用的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_len2,但英文中,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或更多。

 

相關資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM