萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql全文本搜索的一些例子

mysql全文本搜索的一些例子

全文檢索是指計算機索引程序通過掃描文章中的每一個詞,對每一個詞建立一個索引,指明該詞在文章中出現的次數和位置,當用戶查詢時,檢索程序就根據事先建立的索引進行查找,下面我們來看看mysql全文本搜索的實現方法。

一、mysql最長使用的搜索引擎為MyISAM和InnoDB ,前者支持,後者不支持。

二、 全文本搜索有比LIKE匹配和正則表達式匹配更強的功能,在對表進行全文本搜索時,MySQL不需要分表查看每個行,不需要分別分析和處理每個詞。 MySQL創建指定列中各詞的一個索引,搜索可以針對這些詞進行。這樣,MySQL可以有效的決定哪些詞匹配(哪些行包含他們),哪些詞不匹配,他們的匹 配頻率,等等。

三、為了進行全文本搜索,必須索引被搜索的列,而且要隨著數據的改變不斷的重新索引。在對表列進行適當設計後,MySQL會自動進行所有的索引和重新索引。在索引之後,SELECT可與Match()和Against()一起使用以實際執行搜索。

四、一般在創建表時啟用全文本搜索。CREATE TABLE語句接受FULLTEXT子句,它給出被索引列的一個逗號分隔的列表。

 代碼如下 復制代碼 CREATE TABLE productnotes
(
note_id INT NOT NULL AUTO_INCREAMENT,
prod_id CHAR(10) NOT NULL,
note_data DATETIME NOT NULL,
note_text TEXT NULL,
PRIARY KEY(note_id),
FULLTEXT(note_text)
)ENGINE=MyISAM

這裡只指定了一個列note_text進行索引,如果需要也可以指定多個列。在定義之後,MySQL自動維護該索引。增加、刪除和更新行之後,索引會隨之自動更新。可以在創建表時使用FULLTEXT,也可以稍後使用。
注意:不要在導入數據時使用FULLTEXT。

全文索引在 MySQL 中是一個 FULLTEXT 類型索引。FULLTEXT 索引用於 MyISAM 表,可以在 CREATE TABLE 時或之後使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、VARCHAR 或 TEXT 列上創建。對於大的數據庫,將數據裝載到一個沒有 FULLTEXT 索引的表中,然後再使用 ALTER TABLE (或 CREATE INDEX) 創建索引,這將是非常快的。將數據裝載到一個已經有 FULLTEXT 索引的表中,將是非常慢的。

五、 在索引之後,使用兩個函數Match()和Against()執行全文本搜索,其中Match()制定被搜索的列,Against() 指定要使用的搜索表達式:

select note_text from productnotes where match(note_text) against(‘hello’);

注意:1。傳遞給Match()的值必須與FULLTEXT()定義的相同。如果指定多個列,則必須列出它們且次序正確。2. 除非使用BINARY方式,否則全文本搜索不區分大小寫。
試一下這個語句:select note_text,MATCH(note_text) Against as rank from productnotes

六、使用查詢擴展,能找出可能相關的結果,即使他們並不精確包含所要查找的詞。

select note_text from productnotes where match(note_text) against(‘hello’ with QUERY EXPANSION) .

特性:
比起 LIKE 速度還可以
對英文單詞的匹配不錯
使用簡單,無需額外輔助
全文索引FULLTEXT適用於字符串類型的字段信息
如果有這種索引再做批量更新速度很慢
只有MYISAM類型的表才支持FULLTEXT全文索引
默認ft_min_word_len=4 即忽略小於4個字符的單詞,用戶可改
內置保留字,像some,big,the等等,會被直接忽略
對於大型數據庫,將數據裝載到一個沒有 FULLTEXT 索引的表中,然後再使用 ALTER TABLE (或 CREATE INDEX) 創建索引,這將是非常快的,反之是非常慢的

全文搜索帶查詢擴展

全文搜索支持查詢擴展功能 (特別是其多變的“盲查詢擴展功能” )。若搜索短語的長度過短, 那麼用戶則需要依靠全文搜索引擎通常缺乏的內隱知識進行查詢。這時,查詢擴展功能通常很有用。例如, 某位搜索 “database” 一詞的用戶,可能認為“MySQL”、“Oracle”、“DB2” and “RDBMS”均為符合 “databases”的項,因此都應被返回。這既為內隱知識。
在下列搜索短語後添加WITH QUERY EXPANSION,激活盲查詢擴展功能(即通常所說的自動相關性反饋)。它將執行兩次搜索,其中第二次搜索的搜索短語是同第一次搜索時找到的少數頂層文件連接的原始搜索短語。這樣,假如這些文件中的一個 含有單詞 “databases” 以及單詞 “MySQL”, 則第二次搜索會尋找含有單詞“MySQL” 的文件,即使這些文件不包含單詞 “database”。

select * from info where match(title,info) against(‘DataBase’ with query EXPANSION);

布爾全文搜索

特點:
它們不使用 50% 域值
它們不會按照相關性漸弱的順序將行進行分類。你可以從上述問詢結果中看到這一點:相關性最高的行是一個包含兩個“MySQL” 的行,但它被列在最後的位置,而不是開頭位置
即使沒有FULLTEXT,它們仍然可以工作,盡管這種方式的搜索執行的速度非常之慢
最小單詞長度全文參數和最大單詞長度全文參數均適用

停止字適用

布爾全文搜索的性能支持以下操作符:
” + ” 一個前導的加號表示該單詞必須 出現在返回的每一行的開頭位置
” – “一個前導的減號表示該單詞一定不能出現在任何返回的行中
(無操作符) 在默認狀態下(當沒有指定 + 或–的情況下),該單詞可有可無,但含有該單詞的行等級較高。這和MATCH() … AGAINST()不使用IN BOOLEAN MODE修改程序時的運作很類似
” > < "這兩個操作符用來改變一個單詞對賦予某一行的相關值的影響。 > 操作符增強其影響,而 <操作符則減弱其影響。請參見下面的例子
" () "括號用來將單詞分成子表達式。括入括號的部分可以被嵌套
" ~ "一個前導的代字號用作否定符, 用來否定單詞對該行相關性的影響。 這對於標記“noise(無用信息)”的單詞很有用。包含這類單詞的行較其它行等級低,但因其可能會和-號同時使用,因而不會在任何時候都派出所有無用信息行
" * "星號用作截斷符。於其它符號不同的是,它應當被追加到要截斷的詞上
" " "一個被括入雙引號的短語 (‘"’) 只和字面上包含該短語輸入格式的行進行匹配。全文引擎將短語拆分成單詞,在FULLTEXT索引中搜索該單詞。 非單詞字符不需要嚴密的匹配:短語搜索只要求符合搜索短語包含的單詞且單詞的排列順序相同的內容。例如, "test phrase" 符合 "test, phrase"。
"configured database "尋找包含至少兩個單詞中的一個的行
" +configured +database "尋找兩個單詞都包含的行
" +configured database "尋找包含單詞“"configured”的行,若這些行也包含單詞“"database”, 則列為更高等級
" +configured -database "尋找包含單詞“configured” 但不包含單詞 “database”的行
" +configured +(>database<sql) “尋找包含單詞“configured”和“database” 的行,或包含“configured” 和“sql”的行 (無先後順序),然而包含 “configured database”的行較包含“configured sql”的行排列等級更為高
” mysql* “尋找包含”mysql”或有”mysql”開頭單詞的行
” “my sql” “尋找包含原短語“my sql”的行

select * from info where match(title,info) against(“+mysql -yoursql” in boolean mode);
select * from info where match(title,info) against(‘+configured +database’);

其實除了mysql自帶的這個功能,但對於漢字不是很准,小編聽說google有一個mysql全文搜索的插件大家可以搜索一下看看。

copyright © 萬盛學電腦網 all rights reserved