MySQL使用全文本搜尋

2021-08-31 08:02:53 字數 3702 閱讀 9893

1.理解全文本搜尋

mysql資料庫支援幾種基本的資料庫引擎中,並不是所有的引擎都支援本文所描述的全文本搜尋。在兩種最常用的引擎myisam和innodb中,只有前者支援全文本搜尋,而後者不支援。所以如果需要對錶進行全文本搜尋,則需要把該錶的引擎設定為myisam。

全文本搜尋有比like匹配和正規表示式匹配更強的功能,在對錶進行全文本搜尋時,mysql不需要分表檢視每個行,不需要分別分析和處理每個詞。mysql建立指定列中各詞的乙個索引,搜尋可以針對這些詞進行。這樣,mysql可以有效的決定哪些詞匹配(哪些行包含他們),哪些詞不匹配,他們的匹配頻率,等等。

2.使用全文本搜尋

為了進行全文本搜尋,必須索引被搜尋的列,而且要隨著資料的改變不斷的重新索引。在對表列進行適當設計後,mysql會自動進行所有的索引和重新索引。

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

2.1啟用全文本搜尋支援

一般在建立表時啟用全文本搜尋。create table語句接受fulltext子句,它給出被索引列的乙個逗號分隔的列表。

create table productnotes

( note_id int not null auto_increment,

prod_id char(10) not null,

note_date datetime not null,

note_text text null,

primary key(note_id),

fulltext(note_text)

) engine=myisam

這裡只指定了乙個列note_text進行索引,如果需要也可以指定多個列。

在定義之後,mysql自動維護該索引。增加、刪除和更新行之後,索引會隨之自動更新。

可以在建立表時使用fulltext,也可以稍後使用。

注意:不要在匯入資料時使用fulltext。

2.2進行全文本搜尋

在索引之後,使用兩個函式match()和against()執行全文本搜尋,其中match()制定被搜尋的列,against()  指定要使用的搜尋表示式:

select note_text

from `productnotes`

where match(note_text) against('rabbit')\g

輸出結果:

注意:1。傳遞給match()的值必須與fulltext()定義的相同。如果指定多個列,則必須列出它們且次序正確。

2.  除非使用binary方式,否則全文本搜尋不區分大小寫。

下面演示排序的工作方式:

select note_text,match(note_text) against('rabbit') as rank

from `productnotes`

輸出結果:

在本例中。使用match()和against()建立乙個計算列(別名rank),此列包含全文本搜尋計算出的等級值。等級由mysql根據行中詞的數目、唯一詞的數目、整個索引中詞的總數以及包含該詞的行的數目計算出來。正如所見,不包含rabbit的行等級為0.確實包含詞rabbit的兩行每行都有乙個值,文字中詞靠前的行的等級值比靠後的等級值高。

如果指定多個搜尋項,則包含多數匹配詞的行將具有更高的等級值。

2.3使用查詢擴充套件

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

select note_text

from `productnotes`

where match(note_text) against('anvils' with query expansion)

輸出結果:

可以看出,只有第一行包含詞anvils,因此等級最高。第二行與詞anvils無關,但因為它包含第一行中的兩個詞(customer和recommend),所以也被檢索出來,第三行業包含相同的詞,但他們,他們文字中的位置更靠後且分開的更遠,所以排在第三。

2.4 布林文字搜尋

mysql同時還支援布林方式(boolean mode)。可以支援以下細節:

■要匹配的詞;

■要排斥的詞;

■排列提示;

■表示式分組;

■其他。

布林文字搜尋在沒有建立索引的情況下也能使用,但速度會變得非常緩慢。

全文本布林搜尋操作符

布林操作符說明

+                          

包含,詞必須存在 -

排除,詞不必出現

>                       

包含,而且增加等級值

<                       

包含,且減小等級值

()                       

把詞組成子表示式

~                         

取消乙個詞的排序值

*                         

詞尾的萬用字元

""                      

定義乙個短語

舉例說明這些操作符的使用:

select note_text

from `productnotes`

where match(note_text) against('+rabbit +bait' in boolean mode)

/*這個搜尋匹配包含詞rabbit和bait的行*/

select note_text

from `productnotes`

where match(note_text) against('rabbit bait' in boolean mode)

/*沒有指定操作符,匹配包含rabbit和bait的任意乙個的行*/

select note_text

from `productnotes`

where match(note_text) against('"rabbit bait"' in boolean mode)

/*匹配短語rabbit bait*/

select note_text

from `productnotes`

where match(note_text) against('>rabbit 2.5使用說明

■在索引全文本資料時,短詞被忽略且從索引中排除。短詞定義為三個或三個以下字元的詞(數目可以更改)

■mysql帶有乙個內建的stopword列表,這些詞在索引中是被忽略的,如果需要,可以覆蓋這個列表。

■許多詞出現的頻率很高,搜尋他們沒用處。mysql規定如果乙個詞出現50%以上的行中,則作為乙個stopword忽略。這個規則不適用於全文本布林搜尋。

■如果表中行數少於三行,全文本搜尋不返回結果。(因為每個詞或者不出現,或者至少出現在50%的行中)

■忽略詞中的單引號。例如,don't索引為dont。

■不具有詞分隔符(如漢語和日語)的語言不能恰當地返回全文搜尋結果。

■僅在myisam資料庫引擎中支援全文本搜尋。

mysql在全文本 MYSQL全文本搜尋

全文本搜尋 使用全文本搜尋 啟用全文本搜尋 進行全文本搜尋 使用拓展查詢 布林文字搜尋 使用全文本搜尋 為了進行全文本搜尋,必須索引被搜尋的列,而且要隨著資料的改變不斷的重新索引。對表列進行適當的改進後,mysql會自動進行所有的索引和重新索引。優點 效能快 明確控制 智慧型化的結果 啟用全文本搜尋...

MYSQL全文本搜尋

為了進行全文本搜尋,必須索引被搜尋的列,而且要隨著資料的改變不斷的重新索引。對表列進行適當的改進後,mysql會自動進行所有的索引和重新索引。優點 效能快明確控制 智慧型化的結果 fulltext 列名 mysql對該列索引自動更新 使用match 被搜尋的列 against 指定要使用的搜尋表示式...

MySQL的全文本搜尋

我們在使用mysql時,一般會用到兩種引擎 myisam和innodb,myisam支援全文本搜尋,但不支援事務處理 而innodb支援事務處理,但不支援全文本搜尋。一 有時,我們需要使用全文本搜尋,例如 要搜尋文字中存在指定的某個詞,且以這個詞出現的順序排序。先建立支援全文本搜尋的表 create...