?? 博客主頁:博主鏈接
?? 本文由 M malloc 原創(chuàng),首發(fā)于 CSDN??
?? 學(xué)習(xí)專欄推薦:LeetCode刷題集
?? 歡迎點贊 ?? 收藏 ?留言 ?? 如有錯誤敬請指正!
?? 未來很長,值得我們?nèi)Ρ几案篮玫纳?
??MySQL的前情介紹
??大家好呀,今天是我第N次寫MySQL,也是最近才學(xué)習(xí)MySQL,也想著記錄一下自己的學(xué)習(xí)過程,并且分享給大家尼!
??本章詳情
??本篇文章將學(xué)習(xí)如何使用MySQL的全文本搜索功能進行高級的數(shù)據(jù)查詢和選擇。
??理解全文本搜索
前言
并非所有引擎都支持全文本搜索 MySQL支持幾種基本的數(shù)據(jù)庫引警。并非所有的引警都支持本文所描述的全文本搜索。兩個最常使用的引警為MyISAM和InnoDB前者支持全文本搜索,而后者不支持。這就是為什么雖然本書中創(chuàng)建的多數(shù)樣例表使用InnoDB,而有一個樣例表(productnotes表)卻使用MyISAM的原因。如果你的應(yīng)用中需要全文本搜索功能,應(yīng)該記住這一點。
- 前面的文章介紹了LIKE關(guān)鍵字,它利用通配操作符匹配文本(和部分文本)。使用LIKE,能夠查找包含特殊值或部分值的行(不管這些值位于列內(nèi)什么位置)。
- 用基于文本的搜索作為正則表達式匹配列值的更進-步的介紹。使用正則表達式,可以編寫查找所需行的非常復(fù)雜的匹配模
雖然這些搜索機制非常有用,但存在幾個重要的限制。
- 性能一一通配符和正則表達式匹配通常要求MySQL嘗試匹配表中所有行(而且這些搜索極少使用表索引)。因此,由于被搜索行數(shù)不斷增加,這些搜索可能非常耗時。
- 明確控制一一使用通配符和正則表達式匹配,很難(而且并不總是能)明確地控制匹配什么和不匹配什么。例如,指定一個詞必須匹配,一個詞必須不匹配,而一個詞僅在第一個詞確實匹配的情況下才可以匹配或者才可以不匹配。
- 智能化的結(jié)果一雖然基于通配符和正則表達式的搜索提供了非常靈活的搜索,但它們都不能提供一種智能化的選擇結(jié)果的方法例如,一個特殊詞的搜索將會返回包含該詞的所有行,而不區(qū)分包含單個匹配的行和包含多個匹配的行(按照可能是更好的匹配來排列它們)。類似,一個特殊詞的搜索將不會找出不包含該詞但包含其他相關(guān)詞的行。
所有這些限制以及更多的限制都可以用全文本搜索來解決。在使用全文本搜索時,MySQL不需要分別查看每個行,不需要分別分析和處理每個詞。MySQL創(chuàng)建指定列中各詞的一個索引,搜索可以針對這些詞進行。這樣,MySQL可以快速有效地決定哪些詞匹配(哪些行包含它們),哪些詞不匹配,它們匹配的頻率,等等。
??使用全文本搜索
??為了進行全文本搜索,必須索引被搜索的列,而且要隨著數(shù)據(jù)的改變不斷地重新索引。在對表列進行適當(dāng)設(shè)計后,MySQL會自動進行所有的索引和重新索引
在索引之后,SELECT可與Match()和Against()一起使用以實際執(zhí)行搜索。
??啟用全文本搜索支持
般在創(chuàng)建表時啟用全文本搜索。CREATE TABLE語接受FULLTEXT子句,它給出被索引列的一個逗號分隔的列表。
??下面的CREATE語演示了FULLTEXT子句的使用:
輸入
CREATE TABLE productnotes
(
node_id int NOT NULL AUTO_INCREMENT,
prod_id char(10) NOT NULL,
note_date datetime NOT NULL,
note_text text NULL,
PRIMARY KEY(note_text),
FULLTEXT(note_text)
)ENGINE=MyISAM;
分析
現(xiàn)在,只需知道這條CREATE TABLE語句定義表productnotes并列出它所包含的列即可。這些列中有一個名為note_text的列,為了進行全文本搜索,MySQL根據(jù)子句FULLTEXT(note_text)的指示對它進行索引。這里的FULLTEXT索引單個列,如果需要也可以指定多個列。
在定義之后,MySQL自動維護該索引。在增加、更新或刪除行時,索引隨之自動更新。
可以在創(chuàng)建表時指定FULLTEXT,或者在稍后指定(在這種情況下所有已有數(shù)據(jù)必須立即索引)。
不要在導(dǎo)入數(shù)據(jù)時使用FULLTEXT
更新索引要花時間,雖然不是很多,但畢竟要花時間。如果正在導(dǎo)入數(shù)據(jù)到一個新表,此時不應(yīng)該啟用FULLTEXT索引。應(yīng)該首先導(dǎo)入所有數(shù)據(jù),然后再修改表,定義FULLTEXT。這樣有助于更快地導(dǎo)入數(shù)據(jù)(而且使索引數(shù)據(jù)的總時間小于在導(dǎo)入每行時分別進行索引所需的總時間)
??進行全文本搜索
在索引之后,使用兩個函數(shù)Match()和Against()執(zhí)行全文本搜索其中Match()指定被搜索的列,Against()指定要使用的搜索表達式。
下面舉一個例子:
輸入
SELECT note_text FROM productnotes
WHERE Match(note_text) Against('rabbit');
輸出
分析
此SELECT語句檢索單個列note_text。由于WHERE子句,一個全文本搜索被執(zhí)行。Match(note_ text)指示MySQL針對指定的列進行搜索,Against(‘rabbit’)指定詞rabbit作為搜索文本。由于有兩行包含詞rabbit,這兩個行被返回。
使用完整的Match()說明
傳遞給Match()的值必須與FULLTEXT()定義中的相同。如果指定多個列,則必須列出它們(而且次序正確).
搜索不區(qū)分大小寫
除非使用BINARY方式(本篇文章中暫時沒有介紹),否則全文本搜索不區(qū)分大小寫
事實是剛才的搜索可以簡單地用LIKE子句完成,如下所示:
輸入
SELECT note_text FROM productnotes
WHERE note_text LIKE '%rabbit%';
輸出
分析
這條SELECT語句同樣檢索出兩行,但次序不同(雖然并不總是出現(xiàn)這種情況)。
上述兩條SELECT語都不包含ORDER BY子。后者(使用LIKE)以不特別有用的順序返回數(shù)據(jù)。前者(使用全文本搜索) 返回以文本匹配的良好程度排序的數(shù)據(jù)。兩個行都包含詞rabbit,但包含詞rabbit作為第3個詞的行的等級比作為第20個詞的行高。這很重要。全文本搜索的一個重要部分就是對結(jié)果排序。具有較高等級的行先返回(因為這些行很可能是你真正想要的行)。
??使用查詢擴展
提示
查詢擴展用來設(shè)法放寬所返回的全文本搜索結(jié)果的范圍??紤]下面的情況。你想找出所有提到anvils的注釋。只有一個注釋包含詞anvils,但你還想找出可能與你的搜索有關(guān)的所有其他行,即使它們不包含詞anvils
這也是查詢擴展的一項任務(wù)。在使用查詢擴展時,MySQL對數(shù)據(jù)和索引進行兩遍掃描來完成搜索:
- 首先,進行一個基本的全文本搜索,找出與搜索條件匹配的所有行;
- 其次,MySQL檢查這些匹配行并選擇所有有用的詞(我們將會簡要地解釋MySQL如何斷定什么有用,什么無用)。
- 再其次,MySQL再次進行全文本搜索,這次不僅使用原來的條件而且還使用所有有用的詞。
再其次,MySQL再次進行全文本搜索,這次不僅使用原來的條件而且還使用所有有用的詞。
下面舉一個例子,首先進行一個簡單的全文本搜索,沒有查詢擴展:
輸入
SELECT note_text FROM productnotes
WHERE Match(note_text) Against('anvils');
輸出
分析
只有一行包含詞anvils,因此只返回一行
??布爾文本搜索
MySQL支持全文本搜索的另外一種形式,稱為布爾方式 (booleanmode)。以布爾方式,可以提供關(guān)于如下內(nèi)容的細節(jié):
- 要匹配的詞;
- 要排斥的詞(如果某行包含這個詞,則不返回該行,即使它包含其他指定的詞也是如此);
- 排列提示(指定某些詞比其他詞更重要,更重要的詞等級更高);
- 表達式分組;
- 另外一些內(nèi)容。
即使沒有FULLTEXT索引也可以使用
布爾方式不同于迄今為止使用的全文本搜索語法的地方在于,即使沒有定義FULLTEXT索引,也可以使用它。但這是一種非常緩慢的操作(其性能將隨著數(shù)據(jù)量的增加而降低).
為演示IN BOOLEAN MODE的作用,舉一個簡單的例子
輸入
SELECT note_text FROM productnotes
WHERE Match(note_text) Against('heavy' IN BOOLEAN MODE);
輸出
分析
??此全文本搜索檢索包含詞heavy的所有行(有兩行。其中使用了關(guān)鍵字IN BOOLEAN MODE,但實際上沒有指定布爾操作符因此,其結(jié)果與沒有指定布爾方式的結(jié)果相同。
??如何鞏固學(xué)習(xí)
提示:在學(xué)習(xí)的過程中,我們需要先自行進行思考,而不是一遇到不會的就放棄思考直接看答案,如果最后遇到真的不會的題目,我們可以適當(dāng)?shù)倪M行觀看答案,看自己的思路是否正確,在作出正確的判斷
??本文小結(jié)
本篇文章介紹了為什么要使用全文本搜索,以及如何使用MySQL的Match()和Against()函數(shù)進行全文本搜索。我們還學(xué)習(xí)了查詢擴展(它能增加找到相關(guān)匹配的機會)和如何使用布爾方式進行更細致的查找控制。
好啦今日的分享到這里就結(jié)束啦,我是愛你們的M malloc希望可以幫助到你們噢,最后別忘記三連啦?。?/p>
文章來源:http://www.zghlxwxcb.cn/news/detail-568290.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-568290.html
到了這里,關(guān)于【MySQL】不允許你不會全文本搜索的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!