1.對原文進行分詞,再經過相應的搜索算法進行查詢主要是中文分詞,這裏推薦
1.SCWS,簡體中文在線演示地址
2.NLPIR,在線演示地址php2.數據庫方式,經過全文索引進行搜索mysql
創建全文索引的表的存儲引擎類型必須爲MyISAM
問題是match against對中文模糊搜索支持不是太好算法
新建一個utf8 MyISAM類型的表並創建一個全文索引 :sql
CREATE TABLE articles ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT, FULLTEXT (title,body) ) ENGINE=MyISAM DEFAULT CHARSET=UTF8;
其中FULLTEXT(title, body) 給title和body這兩列創建全文索引,以後檢索的時候注意必須同時指定這兩列。數據庫
給這個表添加點測試數據app
INSERT INTO articles (title,body) VALUES ('MySQL Tutorial','DBMS stands for DataBase ...'), ('How To Use MySQL Well','After you went through a ...'), ('Optimizing MySQL','In this tutorial we will show ...'), ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), ('MySQL vs. YourSQL','In the following database comparison ...'), ('MySQL Security','When configured properly, MySQL ...');
全文檢索測試測試
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database');
注意 MATCH (title,body) 裏面的值必須是前面創建全文索引的兩個字段不能少。this
mysql 默認支持全文檢索的字符長度是4,能夠用SHOW VARIABLES LIKE 'ft_min_word_len' 來查看指定的字符長度,也能夠在mysql配置文件my.ini 更改最小字符長度,方法是在my.ini 增長一行 好比:ft_min_word_len = 2,改完後重啓mysql便可。 code
另外,MySQL還會計算一個詞的權值,以決定是否出如今結果集中,具體以下:索引
mysql在集和查詢中的對每一個合適的詞都會先計算它們的權重,一個出如今多個文檔中的詞將有較低的權重(可能甚至有一個零權重),由於在這個特定的集中,它有較低的語義值。不然,若是詞是較少的,它將獲得一個較高的權重,mysql默認的閥值是50%,上面‘you’在每一個文檔都出現,所以是100%,只有低於50%的纔會出如今結果集中。
全文檢索語法
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+apple -banana' IN BOOLEAN MODE);
'+' 表示AND,即必須包含。'-' 表示NOT,即不包含。
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('apple banana' IN BOOLEAN MODE);
apple和banana之間是空格,空格表示OR,即至少包含apple、banana中的一個。
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+apple banana' IN BOOLEAN MODE);
必須包含apple,可是若是同時也包含banana則會得到更高的權重。
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+apple ~banana' IN BOOLEAN MODE);
~ 是咱們熟悉的異或運算符。返回的記錄必須包含apple,可是若是同時也包含banana會下降權重。可是它沒有 +apple -banana 嚴格,由於後者若是包含banana壓根就不返回。
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+apple +(>banana <orange)' IN BOOLEAN MODE);
返回同時包含apple和banana或者同時包含apple和orange的記錄。可是同時包含apple和banana的記錄的權重高於同時包含apple和orange的記錄。