sql知識 08全文本搜尋

2021-10-08 21:36:29 字數 2658 閱讀 4511

mysql支援的幾種基本的資料庫引拳中並非所有的都支援本書所描述的全文本搜尋。最常用的引擎為myisam和innodb,前者支援全文本搜尋,而後者不支援。

萬用字元、正規表示式等搜尋機制非常有用,但在搜尋的時候存在幾個重要的限制:

1、效能差耗時多——萬用字元和正規表示式匹配通常要求mysql嘗試匹配表中所有行(而且這些搜尋極少使用表索引)。因此,由於被搜尋行數不斷增加,這些搜尋可能非常耗時。

2、難以明確控制——使用萬用字元和正規表示式匹配,很難(而且並不總是能)明確地控制匹配什麼和不匹配什麼。例如,指定乙個詞必須匹配,乙個詞必須不匹配,而乙個詞僅在第乙個詞確實匹配得情況下才可以匹配或者才可以不匹配。

3、搜尋結果不夠智慧型——雖然基於萬用字元和正規表示式的搜尋提供了非常靈活的搜尋,但它們都不能提供一種智慧型化的選擇結果的方法。例如,乙個特殊詞的匹配將會返回包含該詞的所有行,而不區分包含單個匹配的行和包含多個匹配的行。

全文本搜尋不同於萬用字元和正規表示式搜尋,它使用索引進行搜尋,相比於前兩者更高效,結果更加智慧型。

如上述的學生資訊表,在資訊一覽有對學生的簡短評價。

傳統的正則方法進行搜尋和全文本搜尋

select information 

from studentinformation

where information like

'%is%';[

sql]

select information

from studentinformation

where

match

(information) against(

'good'

innatural

language

mode

)

match()表示需要進行檢索的列

against()表示需要檢索的詞

注意:當使用innodb等引擎進行全文搜尋的時候會報錯不支援[err] 1214 - the used table type doesn』t support fulltext indexes

1、在索引全文本資料時,短詞被忽略且從索引中排除。短詞定義為那血具有3個或3個以下字元的詞。(如果需要,這個數目可以更改)mysql自帶了乙個內建的非用詞(stopword)列表,這些詞在索引全文本資料時總是被忽略。如果需要,可以覆蓋整個列表。

2、許多詞出現的頻率很高,搜尋它們沒有用處(返回太多結果)。因此,mysql歸定如果乙個詞出現在50%以上的行中,則將它作為乙個非用詞忽略。50%規則不用於in boolean mode。如果表中的行數少於3行,則全文本搜尋不返回結果(因為每個詞或者不出現,或者出現在50%的行中)。

3、忽略詞中的單引號。例如,don』t索引為dont不具有分隔符(腦闊日語和漢語)的語言不能恰當的返回全文搜尋的結果僅在myisam資料庫引擎中支援全文本搜尋。

全文索引主要包含三種分析器:分詞器(word breaker)、詞幹分析器(stemmer)和同義詞分析器。全文索引中儲存的資料是分詞及其位置等資訊,分詞是基於特定語言的語法規則,按照特定的符號尋找詞語的邊界,把文字分解為「單詞」,每乙個單詞叫做乙個分詞(term);全文索引有時會提取分詞的詞幹,把詞幹的多種派生形式儲存為單一詞幹,這個過程叫做提取詞幹;根據使用者提供的自定義同義詞列表,把相關的單詞轉換為同義詞,這個過程叫做提取同義詞。

生成全文索引是把使用者表中的文字資料進行分詞(word breaker)和提取詞幹(stemmer),並轉換同義詞(thesaurus),過濾掉分詞中的停用詞(stopword),最後把處理之後的資料儲存到全文索引中。把資料儲存到全文資料的過程叫做填充(populate)或爬蟲(crawl)程序,全文索引的更新方式可以手動填充,自動填充,或增量填充。

分詞器

用於分詞,它根據特定語言的語法規則,分割文字中的單詞,分詞器在拆分單詞時,還會記錄每個分詞在字串中的位置,分詞器把分詞,分詞的位置,文件id,全文索引列的序號等資訊的組合,稱作標記(token)。例如,對於語句"kitty is a white pig",在全文索引填充時,分詞器把該語句拆分成5個單詞:kitty,is,a,white,pig。 如果使用預設的停用詞列表,那麼「is」,「a」都是停用詞,全文索引會把停用詞丟失,只儲存分詞:kitty,white,pig。

停用詞

停用字詞列表(stoplist)是非索引字詞的列表,每個stoplist中儲存的分詞都是不會用於搜尋的分詞,叫做停用詞(stopwords),全文索引不會儲存停用詞,但是停用詞所佔的位置會被記錄,如果對停用詞進行contians查詢,即使基礎表(underly table)中的字段中存在該停用詞,全文索引也不會返回任何資料行。通常情況下,停用詞(stopword)都是常用的單詞,在語句**現的頻率十分高,過濾掉停用詞,能夠減少全文索引的size,提高全文查詢的效能。

詞幹抽取器

用於把同源單詞轉換為其根形式,能夠轉換為相同根形式的單詞是同源的。比如sleep、sleeping等會被歸結於同源

同義詞詞典

是乙個xml檔案,用於定義特定語言的同義詞列表,例如,我們可以設定「author」 , 「writer」 ,「journalist」是同義詞。

mysql在全文本 MYSQL全文本搜尋

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

MYSQL全文本搜尋

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

MySQL的全文本搜尋

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