mysql 文本搜尋

來源:互聯網
上載者:User

標籤:索引   引擎   位置   沒有   src   生活   排序   決定   ddn   

全文本搜尋

MySQL支援幾種基本的資料庫引擎,但並非所有的引擎都支援全文本搜尋。兩個最常使用的引擎為MyISAM和InnoDB,前者支援全文本搜尋,後者就不支援。

理解全文本搜尋

在前面的學習中,我們都知道有兩種方式來匹配文本。一種是使用like關鍵字來進行匹配,另外一種就是使用Regex來進行匹配。

雖然使用Regex就可以編寫尋找所需行的足夠複雜的匹配模式。但是,這些存在幾個重要的限制影響:

1、效能:萬用字元和Regex時嘗試匹配表中所有行,而這些搜尋極少使用了表索引,因此,相當慢

2、明確控制:在匹配過程中,我們很少會相當的明確的知道我們想匹配什麼,不匹配什麼。

3、具有優先順序的結果:在使用萬用字元和Regex進行匹配時,只是返回包含該匹配條件的結果,而不區分匹配程度(多個匹配和單個匹配的區別,在前面就匹配和在後面匹配的區別)。

上面提到的這些限制,都可以利用全文本搜尋來進行解決。

使用全文本搜尋

為了進行全文本搜尋,必須索引被搜尋的列,而且要隨著資料的改變不斷地重新索引。

在對錶進行適當的設計之後,MySQL會自動進行所有的索引和重新索引。

在索引之後,select可與match() 和against()一起使用以實際執行索引。

那麼,在建表的時候,如何啟用全文本搜尋支援呢???

如下: 

上面就這樣通過fulltext 為指定行建立的相應的索引,如果,想指定多個列,將多個列都放入fulltext裡面即可。

在定義之後,MySQL會自動維護該索引。無論是在增加、更新還是刪除,索引也會隨之更新。

進行全文本搜尋

上面在建表後此表就有了全文本搜尋的能力了,下面我們開始嘗試下全文本搜尋。 
在索引之前,我為test_text表增加了如下內容: 

當我們想利用全文本搜尋得到 包含MySQL內容的資料。

如下:

select * from test_text where match(content) against(‘MySQL‘);

上面語句中 match(content) 指示MySQL針對指定的列進行搜尋,注意:傳遞給match()的值必須與fulltext()定義中的相同。against(‘MySQL’)指定詞MySQL作為搜尋文本。

從結果可以看出,我們得到了兩行包括MySQL字串的資料。

上面的搜尋利用我們學過的Like也可以完成,如下:

這兩種方法的結果是一樣的。次序也一樣,理論上來說,利用全文本搜尋會對出來的結果按照優先順序來進行排序輸出,但是從結果可以看出,在第一條語句中MySQL出現的位置相比第二條語句中的MySQL的位置還要滯後,為什麼會出現在前面呢??,與MySQL必知必會上面介紹的有一點出入

為了驗證上面出現的問題,我們可以查下結果的優先順序。在查看優先順序之前,我又加入了一個以MySQL開頭的行資料。下面舉來看下優先順序。

select id,content,match(content) against(‘MySQL‘) from test_text ;

從結果可以看出,確實是id=7的行的優先順序大於id=8的優先順序,原因在於優先順序並不至於出現的先後位置有關係,還與諸如文本長度等因素也有關係。 

在增加了一行以MySQL開頭的行資料之後,我們來一起觀察下上面這兩種方法的結果。

從上面兩圖可以明顯看出,確實,利用全文本搜尋對搜尋到的內容進行一定的排序,而萬用字元卻沒有進行排序。至於全文本搜尋對搜尋到的內容進行排序由很多因素來進行決定,比如:出現的位置、出現的次數、文本自身的長度等等。

等級越高,出現的位置就越靠前,在我們生活中使用的搜尋引擎(例如百度、google等)進行搜尋東西的時候,我相信也是按照這樣的邏輯來出現結果,當然除了百度公司收了別人錢把不匹配的內容人為的放在更前面。

使用查詢擴充:with query expansion

前面介紹的只是普通的全文本搜尋。

但是,我們在生活中常常有更嚴格的要求,例如,我希望搜尋 的內容包括MySQL字串,你還想得到與MySQL相關的內容(即使沒有出現MySQL字眼),應該怎麼來做呢??

這就需要我們使用查詢擴充了。

用法 :在against(關鍵字 with query expansion) 即可 

從結果可以看出,當我們使用了查詢擴充之後,就得到了更多相關的內容,即使這些內容不包括MySQL字眼。

至於MySQL是如何根據MySQL來得到與之相關的關鍵字,目前我還不清楚。

布爾文本搜尋

MySQL支援全文本搜尋的另外一種形式,稱為布爾方式。以布爾方式,可以提供如下內容的細節:

  • 要匹配的詞;
  • 要排斥的詞、
  • 排列提示(指定某些詞比其他詞更重要,更重要的詞等級更高)
  • 運算式分組。

要說明的是:即使沒有fulltext索引也可以使用,只是速度相當相當的慢。

為顯示 in boolean mode的作用,以一個簡單的例子來進行說明。

select * from test_text where match(content) against(‘MySQL -interesting‘ in boolean mode);//返回必須包含MySQL不能包含interesting內容的資料。

關於全文本布爾操作符,見下表(來源於:《MySQL必知必會》這本書)

關於全文本布爾操作符的具體使用執行個體,與上面的例子類似,這裡不在進行具體介紹。

全文本搜尋的使用說明

1、MySQL帶有一個內建的非用詞列表。這些詞在索引全文本資料時總是被忽略。如果需要,可以覆蓋這個列表。

2、許多詞出現的頻率很高,搜尋他們沒有用處(因為返回太多的結果)。因此,MySQL規定了一條50%規則,如果一個詞出現在50%以上的行中,則將它作為一個非用詞忽略。50%規則不用於in boolean mode.

3、如果表中的資料的行數小於3行,則全文本搜尋不返回結果。因此每個詞要麼不出現,出現就至少為50%。

4、忽略詞中的單引號。例如:don’t 索引為dont。

mysql 文本搜尋

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.