標籤:任務 而且 指定 方式 規則 針對 .com mode 部分
1、何為全文檢索搜尋
在使用全文本搜尋時,MySQL不需要分別查看每個行,不需要分別分析和處理每個詞。MySQL建立指定列中各詞的一個索引,搜尋可以針對這些詞進行。這樣,MySQL可以快速有效地決定哪些詞匹配(哪些行包含它們),哪些詞不匹配,它們匹配的頻率,等等。
(並非所有的引擎都支援本書所描述的全文本搜尋。兩個最常使用的引擎為MyISAM和InnoDB,前者支援全文本搜尋,而後者不支援。)
2、全文檢索搜尋的準備
一般在建立表時啟用全文本搜尋。CREATE TABLE語句(第21章中介紹)接受FULLTEXT子句,它給出被索引列的一個逗號分隔的列表。
在建表時添加的資訊:FULLTEXT KEY (note_text)
MySQL根據子句FULLTEXT(note_text)的指示對它進行索引。這裡的FULLTEXT索引單個列,如果需要也可以指定多個列。在定義之後,MySQL自動維護該索引。在增加、更新或刪除行時,索引隨之自動更新。可以在建立表時指定FULLTEXT,或者在稍後指定(在這種情況下所有已有資料必須立即索引)。
3、全文檢索搜尋
使用兩個函數Match()和Against()執行全文本搜尋,其中Match()指定被搜尋的列,Against()指定要使用的搜尋運算式。
SELECT note_textFROM productnotes WHERE MATCH(note_text) AGAINST(‘rabbit‘)
注意:傳遞給Match() 的值必須與FULLTEXT()定義中的相同。如果指定多個列,則必須列出它們(而且次序正確)。
除非使用BINARY方式,否則全文本搜尋不區分大小寫。
與之類似:
SELECT note_textFROM productnotes WHERE note_text LIKE %rabbit%
但是全文本搜尋的一個重要部分就是對結果排序(等級由MySQL根據行中詞的數目、唯一詞的數目、整個索引中詞的總數以及包含該詞的行的數目計算出來。)。具有較高等級的行先返回,
而like不是,且查詢效能差。
4、使用擴充查詢
所有提到anvils的注釋。只有一個注釋包含詞anvils,但你還想找出可能與你的搜尋有關的所有其他行,即使它們不包含詞anvils。
這也是查詢擴充的一項任務。在使用查詢擴充時,MySQL對資料和索引進行兩遍掃描來完成搜尋:
? 首先,進行一個基本的全文本搜尋,找出與搜尋條件匹配的所有行;
? 其次,MySQL檢查這些匹配行並選擇所有有用的詞。
? 再其次,MySQL再次進行全文本搜尋,這次不僅使用原來的條件,而且還使用所有有用的詞。
SELECT note_textFROM productnotes ;WHERE MATCH(note_text) AGAINST(‘rabbit‘ WITH QUERY EXPANSION);
5、布爾查詢(效率不高且可以用在非指定的FULLTEXT中)
? 要匹配的詞;
? 要排斥的詞(如果某行包含這個詞,則不返回該行,即使它包含其他指定的詞也是如此);
? 排列提示(指定某些詞比其他詞更重要,更重要的詞等級更高);
? 運算式分組;
? 另外一些內容。
注意:
? 在索引全文本資料時,短詞被忽略且從索引中排除。短詞定義為那些具有3個或3個以下字元的詞(如果需要,這個數目可以更改)。
? MySQL帶有一個內建的非用詞(stopword)列表,這些詞在索引全文本資料時總是被忽略。如果需要,可以覆蓋這個列表
? 許多詞出現的頻率很高,搜尋它們沒有用處(返回太多的結果)。因此,MySQL規定了一條50%規則,如果一個詞出現在50%以上的行中,則將它作為一個非用詞忽略。50%規則不用於IN BOOLEANMODE。
? 如果表中的行數少於3行,則全文本搜尋不返回結果(因為每個詞或者不出現,或者至少出現在50%的行中)。
? 忽略詞中的單引號。例如,don‘t索引為dont。
? 不具有詞分隔字元(包括日語和漢語)的語言不能恰當地返回全文本搜尋結果。
MySql學習之全文檢索索引