mysql 函數(shù)之全文搜索功能

語(yǔ)法:

?MATCH?(col1,col2,...)?AGAINST?(expr?[IN?BOOLEAN?MODE?|?WITH?QUERY?EXPANSION])

mysql支持全文索引和搜索功能。MySQL中的全文索引類(lèi)型FULLTEXT的索引。? FULLTEXT?索引僅可用于?MyISAM表;他們可以從CHAR、?VARCHAR或TEXT列中作為CREATE TABLE語(yǔ)句的一部分被創(chuàng)建,或是隨后使用ALTER TABLE?或?CREATE INDEX被添加。對(duì)于較大的數(shù)據(jù)集,將你的資料輸入一個(gè)沒(méi)有FULLTEXT索引的表中,然后創(chuàng)建索引, 其速度比把資料輸入現(xiàn)有FULLTEXT索引的速度更為快。

全文搜索同MATCH()函數(shù)一起執(zhí)行。

mysql>?CREATE?TABLE?articles?(????->???id?INT?UNSIGNED?AUTO_INCREMENT?NOT?NULL?PRIMARY?KEY,????->???title?VARCHAR(200),????->???body?TEXT,????->???FULLTEXT?(title,body)????->?);Query?OK,?0?rows?affected?(0.00?sec)  mysql>?INSERT?INTO?articles?(title,body)?VALUES????->?('MySQL?Tutorial','DBMS?stands?for?DataBase?...'),????->?('How?To?Use?MySQL?Well','After?you?went?through?a?...'),????->?('Optimizing?MySQL','In?this?tutorial?we?will?show?...'),????->?('1001?MySQL?Tricks','1.?Never?run?mysqld?as?root.?2.?...'),????->?('MySQL?vs.?YourSQL','In?the?following?database?comparison?...'),????->?('MySQL?Security','When?configured?properly,?MySQL?...');Query?OK,?6?rows?affected?(0.00?sec)  Records:?6??Duplicates:?0??Warnings:?0  mysql>?SELECT?*?FROM?articles????->?WHERE?MATCH?(title,body)?AGAINST?('database');  +----+-------------------+------------------------------------------+  |?id?|?title?????????????|?body?????????????????????????????????????|  +----+-------------------+------------------------------------------+  |??5?|?MySQL?vs.?YourSQL?|?In?the?following?database?comparison?...?|  |??1?|?MySQL?Tutorial????|?DBMS?stands?for?DataBase?...?????????????|  +----+-------------------+------------------------------------------+  2?rows?in?set?(0.00?sec)

MATCH()函數(shù)對(duì)于一個(gè)字符串執(zhí)行資料庫(kù)內(nèi)的自然語(yǔ)言搜索。一個(gè)資料庫(kù)就是1套1個(gè)或2個(gè)包含在FULLTEXT內(nèi)的列。搜索字符串作為對(duì)AGAINST()的參數(shù)而被給定。對(duì)于表中的每一行, MATCH()?返回一個(gè)相關(guān)值,即,?搜索字符串和?MATCH()表中指定列中該行文字之間的一個(gè)相似性度量。

在默認(rèn)狀態(tài)下,?搜索的執(zhí)行方式為不區(qū)分大小寫(xiě)方式。然而,你可以通過(guò)對(duì)編入索引的列使用二進(jìn)制排序方式執(zhí)行區(qū)分大小寫(xiě)的全文搜索。?例如,可以向一個(gè)使用latin1字符集的列給定latin1_bin?的排序方式,對(duì)于全文搜索區(qū)分大小寫(xiě)。

如上述所舉例子,當(dāng)MATCH()被用在一個(gè)?WHERE?語(yǔ)句中時(shí),相關(guān)值是非負(fù)浮點(diǎn)數(shù)。零相關(guān)的意思是沒(méi)有相似性。相關(guān)性的計(jì)算是基于該行中單詞的數(shù)目,?該行中獨(dú)特子的數(shù)目,資料庫(kù)中單詞的總數(shù),以及包含特殊詞的文件(行)數(shù)目。

對(duì)于自然語(yǔ)言全文搜索,要求MATCH()?函數(shù)中命名的列和你的表中一些FULLTEXT索引中包含的列相同。對(duì)于前述問(wèn)訊, 注意,MATCH()函數(shù)(題目及全文)中所命名的列和文章表的FULLTEXT索引中的列相同。若要分別搜索題目和全文,應(yīng)該對(duì)每個(gè)列創(chuàng)建FULLTEXT索引。

或者也可以運(yùn)行布爾搜索或使用查詢(xún)擴(kuò)展進(jìn)行搜索。

上面的例子基本上展示了怎樣使用返回行的相關(guān)性順序漸弱的MATCH()函數(shù)。而下面的例子則展示了怎樣明確地檢索相關(guān)值。返回行的順序是不定的,原因是? SELECT?語(yǔ)句不包含?WHERE或ORDER BY?子句:

mysql>?SELECT?id,?MATCH?(title,body)?AGAINST?('Tutorial')????->?FROM?articles;  +----+-----------------------------------------+  |?id?|?MATCH?(title,body)?AGAINST?('Tutorial')?|  +----+-----------------------------------------+  |??1?|????????????????????????0.65545833110809?|  |??2?|???????????????????????????????????????0?|  |??3?|????????????????????????0.66266459226608?|  |??4?|???????????????????????????????????????0?|  |??5?|???????????????????????????????????????0?|  |??6?|???????????????????????????????????????0?|  +----+-----------------------------------------+  6?rows?in?set?(0.00?sec)

下面的例子則更加復(fù)雜。詢(xún)問(wèn)返回相關(guān)值,同時(shí)對(duì)行按照相關(guān)性漸弱的順序進(jìn)行排序。為實(shí)現(xiàn)這個(gè)結(jié)果,你應(yīng)該兩次指定MATCH(): 一次在?SELECT?列表中而另一次在?WHERE子句中。這不會(huì)引起額外的內(nèi)務(wù)操作,原因是MySQL?優(yōu)化程序注意到兩個(gè)MATCH()調(diào)用是相同的,從而只會(huì)激活一次全文搜索代碼。

mysql>?SELECT?id,?body,?MATCH?(title,body)?AGAINST????->?('Security?implications?of?running?MySQL?as?root')?AS?score????  ->?FROM?articles?WHERE?MATCH?(title,body)?AGAINST????->?('Security?implications?of?running?MySQL?as?root');  +----+-------------------------------------+-----------------+  |?id?|?body???????????|?score???????????|  +----+-------------------------------------+-----------------+  |??4?|?1.?Never?run?mysqld?as?root.?2.?...?|?1.5219271183014?|  |??6?|?When?configured?properly,?MySQL?...?|?1.3114095926285?|  +----+-------------------------------------+-----------------+  2?rows?in?set?(0.00?sec)

表中有2行(0.00?秒)

MySQL FULLTEXT?執(zhí)行將任何單字字符原形?(字母、數(shù)字和下劃線(xiàn)部分)的序列視為一個(gè)單詞。這個(gè)序列或許也包含單引號(hào)?(‘),但在一行中不會(huì)超過(guò)一個(gè)。 這意味著?aaa’bbb?會(huì)被視為一個(gè)單詞,而?aaa”bbb則被視為2個(gè)單詞。位于單詞之前或其后的單引號(hào)會(huì)被FULLTEXT分析程序去掉;?‘aaa’bbb’?會(huì)變成?? aaa’bbb。

FULLTEXT分析程序會(huì)通過(guò)尋找某些分隔符來(lái)確定單詞的起始位置和結(jié)束位置,例如’ ‘ (間隔符號(hào))、?, (逗號(hào))以及?. (句號(hào))。假如單詞沒(méi)有被分隔符分開(kāi),(例如在中文里?),?則?FULLTEXT?分析程序不能確定一個(gè)詞的起始位置和結(jié)束位置。為了能夠在這樣的語(yǔ)言中向FULLTEXT?索引添加單詞或其它編入索引的術(shù)語(yǔ),你必須對(duì)它們進(jìn)行預(yù)處理,使其被一些諸如”之類(lèi)的任意分隔符分隔開(kāi)。

一些詞在全文搜索中會(huì)被忽略:

任何過(guò)于短的詞都會(huì)被忽略。 全文搜索所能找到的詞的默認(rèn)最小長(zhǎng)度為?4個(gè)字符。

停止字中的詞會(huì)被忽略。禁用詞就是一個(gè)像“the” 或“some” 這樣過(guò)于平常而被認(rèn)為是不具語(yǔ)義的詞。存在一個(gè)內(nèi)置的停止字, 但它可以通過(guò)用戶(hù)自定義列表被改寫(xiě)。

詞庫(kù)和詢(xún)問(wèn)中每一個(gè)正確的單詞根據(jù)其在詞庫(kù)和詢(xún)問(wèn)中的重要性而被衡量。??通過(guò)這種方式,一個(gè)出現(xiàn)在許多文件中的單詞具有較低的重要性(而且甚至很多單詞的重要性為零),原因是在這個(gè)特別詞庫(kù)中其語(yǔ)義價(jià)值較低。反之,假如這個(gè)單詞比較少見(jiàn),那么它會(huì)得到一個(gè)較高的重要性。然后單詞的重要性被組合,從而用來(lái)計(jì)算該行的相關(guān)性。

這項(xiàng)技術(shù)最適合同大型詞庫(kù)一起使用?(事實(shí)上,?此時(shí)它經(jīng)過(guò)仔細(xì)的調(diào)整?)。對(duì)于很小的表,單詞分布并不能充分反映它們的語(yǔ)義價(jià)值, 而這個(gè)模式有時(shí)可能會(huì)產(chǎn)生奇特的結(jié)果。例如,?雖然單詞 “MySQL” 出現(xiàn)在文章表中的每一行,但對(duì)這個(gè)詞的搜索可能得不到任何結(jié)果:

mysql>?SELECT?*?FROM?articles  ->?WHERE?MATCH?(title,body)?AGAINST?('MySQL');  找不到搜索的詞(0.00?秒)

這個(gè)搜索的結(jié)果為空,原因是單詞 “MySQL” 出現(xiàn)在至少全文的50%的行中。 因此,?它被列入停止字。對(duì)于大型數(shù)據(jù)集,使用這個(gè)操作最合適不過(guò)了—-一個(gè)自然語(yǔ)言問(wèn)詢(xún)不會(huì)從一個(gè)1GB?的表每隔一行返回一次。對(duì)于小型數(shù)據(jù)集,它的用處可能比較小。

一個(gè)符合表中所有行的內(nèi)容的一半的單詞查找相關(guān)文檔的可能性較小。事實(shí)上,?它更容易找到很多不相關(guān)的內(nèi)容。我們都知道,當(dāng)我們?cè)谝蛱鼐W(wǎng)上試圖使用搜索引擎尋找資料的時(shí)候,這種情況發(fā)生的頻率頗高??梢酝普摚搯卧~的行因其所在特別數(shù)據(jù)集?而被賦予較低的語(yǔ)義價(jià)值。 一個(gè)給定的詞有可能在一個(gè)數(shù)據(jù)集中擁有超過(guò)其50%的域值,而在另一個(gè)數(shù)據(jù)集卻不然。

當(dāng)你第一次嘗試使用全文搜索以了解其工作過(guò)程時(shí),這個(gè)50%?的域值提供重要的蘊(yùn)涵操作:若你創(chuàng)建了一個(gè)表,并且只將文章的1、2行插入其中, 而文中的每個(gè)單詞在所有行中出現(xiàn)的機(jī)率至少為? 50%?。那么結(jié)果是你什么也不會(huì)搜索到。一定要插入至少3行,并且多多益善。需要繞過(guò)該50%?限制的用戶(hù)可使用布爾搜索代碼。

1.?布爾全文搜索

利用IN BOOLEAN MODE修改程序,?MySQL?也可以執(zhí)行布爾全文搜索:

mysql>?SELECT?*?FROM?articles?WHERE?MATCH?(title,body)????->?AGAINST?('+MySQL?-YourSQL'?IN?BOOLEAN?MODE);  +----+-----------------------+-------------------------------------+  |?id?|?title?????????????????|?body????????????????????????????????|  +----+-----------------------+-------------------------------------+  |??1?|?MySQL?Tutorial????????|?DBMS?stands?for?DataBase?...????????|  |??2?|?How?To?Use?MySQL?Well?|?After?you?went?through?a?...????????|  |??3?|?Optimizing?MySQL??????|?In?this?tutorial?we?will?show?...???|  |??4?|?1001?MySQL?Tricks?????|?1.?Never?run?mysqld?as?root.?2.?...?|  |??6?|?MySQL?Security????????|?When?configured?properly,?MySQL?...?|  +----+-----------------------+-------------------------------------+

這個(gè)問(wèn)詢(xún)檢索所有包含單詞“MySQL”的行,但不檢索包含單詞“YourSQL”的行。

布爾全文搜索具有以下特點(diǎn):

它們不使用?50%?域值。.

它們不會(huì)按照相關(guān)性漸弱的順序?qū)⑿羞M(jìn)行分類(lèi)。你可以從上述問(wèn)詢(xún)結(jié)果中看到這一點(diǎn):相關(guān)性最高的行是一個(gè)包含兩個(gè)“MySQL” 的行,但它被列在最后的位置,而不是開(kāi)頭位置。

即使沒(méi)有FULLTEXT,它們?nèi)匀豢梢怨ぷ?,盡管這種方式的搜索執(zhí)行的速度非常之慢。

最小單詞長(zhǎng)度全文參數(shù)和最大單詞長(zhǎng)度全文參數(shù)均適用。

停止字適用。

布爾全文搜索的性能支持以下操作符:

+

一個(gè)前導(dǎo)的加號(hào)表示該單詞必須?出現(xiàn)在返回的每一行的開(kāi)頭位置。

一個(gè)前導(dǎo)的減號(hào)表示該單詞一定不能出現(xiàn)在任何返回的行中。

(無(wú)操作符)

在默認(rèn)狀態(tài)下(當(dāng)沒(méi)有指定?+?或–的情況下),該單詞可有可無(wú),但含有該單詞的行等級(jí)較高。這和MATCH() … AGAINST()不使用IN BOOLEAN MODE修改程序時(shí)的運(yùn)作很類(lèi)似。

>

這兩個(gè)操作符用來(lái)改變一個(gè)單詞對(duì)賦予某一行的相關(guān)值的影響。?>?操作符增強(qiáng)其影響,而?

( )

括號(hào)用來(lái)將單詞分成子表達(dá)式。括入括號(hào)的部分可以被嵌套。

~

一個(gè)前導(dǎo)的代字號(hào)用作否定符, 用來(lái)否定單詞對(duì)該行相關(guān)性的影響。 這對(duì)于標(biāo)記“noise(無(wú)用信息)”的單詞很有用。包含這類(lèi)單詞的行較其它行等級(jí)低,但因其可能會(huì)和-號(hào)同時(shí)使用,因而不會(huì)在任何時(shí)候都派出所有無(wú)用信息行。

*

星號(hào)用作截?cái)喾S谄渌?hào)不同的是,它應(yīng)當(dāng)被追加到要截?cái)嗟脑~上。

一個(gè)被括入雙引號(hào)的短語(yǔ)?(‘”’)?只和字面上包含該短語(yǔ)輸入格式的行進(jìn)行匹配。全文引擎將短語(yǔ)拆分成單詞,在FULLTEXT索引中搜索該單詞。???非單詞字符不需要嚴(yán)密的匹配:短語(yǔ)搜索只要求符合搜索短語(yǔ)包含的單詞且單詞的排列順序相同的內(nèi)容。例如,?“test phrase”?符合?“test, phrase”。

若索引中不存在該短語(yǔ)包含的單詞,則結(jié)果為空。例如,若所有單詞都是禁用詞,或是長(zhǎng)度都小于編入索引單詞的最小長(zhǎng)度,則結(jié)果為空。

以下例子展示了一些使用布爾全文符號(hào)的搜索字符串:

‘apple banana’

尋找包含至少兩個(gè)單詞中的一個(gè)的行。

‘+apple +juice’

尋找兩個(gè)單詞都包含的行。

‘+apple macintosh’

尋找包含單詞“apple”的行,若這些行也包含單詞“macintosh”, 則列為更高等級(jí)。

‘+apple -macintosh’

尋找包含單詞“apple” 但不包含單詞 “macintosh”的行。

‘+apple +(>turnover

尋找包含單詞“apple”和“turnover” 的行,或包含“apple” 和“strudel”的行?(無(wú)先后順序),然而包含 “apple turnover”的行較包含“apple strudel”的行排列等級(jí)更為高。

‘apple*’

尋找包含“apple”、“apples”、“applesauce”或“applet”的行。

‘”some words”‘

尋找包含原短語(yǔ)“some words”的行?(例如,包含“some words of wisdom” 的行,而非包含??“some noise words”的行)。注意包圍詞組的‘”’ 符號(hào)是界定短語(yǔ)的操作符字符。它們不是包圍搜索字符串本身的引號(hào)。

2.?全文搜索帶查詢(xún)擴(kuò)展

全文搜索支持查詢(xún)擴(kuò)展功能?(特別是其多變的“盲查詢(xún)擴(kuò)展功能”?)。若搜索短語(yǔ)的長(zhǎng)度過(guò)短,?那么用戶(hù)則需要依靠全文搜索引擎通常缺乏的內(nèi)隱知識(shí)進(jìn)行查詢(xún)。這時(shí),查詢(xún)擴(kuò)展功能通常很有用。例如,?某位搜索 “database” 一詞的用戶(hù),可能認(rèn)為“MySQL”、“Oracle”、“DB2”?and?“RDBMS”均為符合 “databases”的項(xiàng),因此都應(yīng)被返回。這既為內(nèi)隱知識(shí)。

在下列搜索短語(yǔ)后添加WITH QUERY EXPANSION,激活盲查詢(xún)擴(kuò)展功能(即通常所說(shuō)的自動(dòng)相關(guān)性反饋)。它將執(zhí)行兩次搜索,其中第二次搜索的搜索短語(yǔ)是同第一次搜索時(shí)找到的少數(shù)頂層文件連接的原始搜索短語(yǔ)。這樣,假如這些文件中的一個(gè) 含有單詞 “databases” 以及單詞 “MySQL”,?則第二次搜索會(huì)尋找含有單詞“MySQL” 的文件,即使這些文件不包含單詞 “database”。下面的例子顯示了這個(gè)不同之處:

mysql>?SELECT?*?FROM?articles????->?WHERE?MATCH?(title,body)?AGAINST?('database');  +----+-------------------+------------------------------------------+  |?id?|?title?????????????|?body?????????????????????????????????????|  +----+-------------------+------------------------------------------+  |??5?|?MySQL?vs.?YourSQL?|?In?the?following?database?comparison?...?|  |??1?|?MySQL?Tutorial????|?DBMS?stands?for?DataBase?...?????????????|  +----+-------------------+------------------------------------------+  2?rows?in?set?(0.00?sec)    mysql>?SELECT?*?FROM?articles????->?WHERE?MATCH?(title,body)????->?AGAINST?('database'?WITH?QUERY?EXPANSION);  +----+-------------------+------------------------------------------+  |?id?|?title?????????????|?body?????????????????????????????????????|  +----+-------------------+------------------------------------------+  |??1?|?MySQL?Tutorial????|?DBMS?stands?for?DataBase?...?????????????|  |??5?|?MySQL?vs.?YourSQL?|?In?the?following?database?comparison?...?|  |??3?|?Optimizing?MySQL??|?In?this?tutorial?we?will?show?...????????|  +----+-------------------+------------------------------------------+  3?rows?in?set?(0.00?sec)

另一個(gè)例子是Georges Simenon?搜索關(guān)于Maigret的書(shū)籍,?這個(gè)用戶(hù)不確定“Maigret”一詞的拼法。若不使用查詢(xún)擴(kuò)展而搜索“Megre and the reluctant witnesses” 得到的結(jié)果只能是的“Maigret and the Reluctant Witnesses” 。 而帶有查詢(xún)擴(kuò)展的搜索會(huì)在第二遍得到帶有“Maigret”一詞的所有書(shū)名。

注釋?zhuān)??盲查詢(xún)擴(kuò)展功能很容易返回非相關(guān)文件而增加無(wú)用信息,因此只有在查詢(xún)一個(gè)長(zhǎng)度很短的短語(yǔ)時(shí)才有必要使用這項(xiàng)功能。

3.?全文停止字

以下表列出了默認(rèn)的全文停止字:

a’s ? ?able ? ?about ? ?above ? ?according ? ?

accordingly ? ?across ? ?actually ? ?after ? ?afterwards ? ?

again ? ?against ? ?ain’t ? ?all ? ?allow ? ?

allows ? ?almost ? ?alone ? ?along ? ?already ? ?

also ? ?although ? ?always ? ?am ? ?among ? ?

amongst ? ?an ? ?and ? ?another ? ?any ? ?

anybody ? ?anyhow ? ?anyone ? ?anything ? ?anyway ? ?

anyways ? ?anywhere ? ?apart ? ?appear ? ?appreciate ? ?

appropriate ? ?are ? ?aren’t ? ?around ? ?as ? ?

aside ? ?ask ? ?asking ? ?associated ? ?at ? ?

available ? ?away ? ?awfully ? ?be ? ?became ? ?

because ? ?become ? ?becomes ? ?becoming ? ?been ? ?

before ? ?beforehand ? ?behind ? ?being ? ?believe ? ?

below ? ?beside ? ?besides ? ?best ? ?better ? ?

between ? ?beyond ? ?both ? ?brief ? ?but ? ?

by ? ?c’mon ? ?c’s ? ?came ? ?can ? ?

can’t ? ?cannot ? ?cant ? ?cause ? ?causes ? ?

certain ? ?certainly ? ?changes ? ?clearly ? ?co ? ?

com ? ?come ? ?comes ? ?concerning ? ?consequently ? ?

consider ? ?considering ? ?contain ? ?containing ? ?contains ? ?

corresponding ? ?could ? ?couldn’t ? ?course ? ?currently ? ?

definitely ? ?described ? ?despite ? ?did ? ?didn’t ? ?

different ? ?do ? ?does ? ?doesn’t ? ?doing ? ?

don’t ? ?done ? ?down ? ?downwards ? ?during ? ?

each ? ?edu ? ?eg ? ?eight ? ?either ? ?

else ? ?elsewhere ? ?enough ? ?entirely ? ?especially ? ?

et ? ?etc ? ?even ? ?ever ? ?every ? ?

everybody ? ?everyone ? ?everything ? ?everywhere ? ?ex ? ?

exactly ? ?example ? ?except ? ?far ? ?few ? ?

fifth ? ?first ? ?five ? ?followed ? ?following ? ?

follows ? ?for ? ?former ? ?formerly ? ?forth ? ?

four ? ?from ? ?further ? ?furthermore ? ?get ? ?

gets ? ?getting ? ?given ? ?gives ? ?go ? ?

goes ? ?going ? ?gone ? ?got ? ?gotten ? ?

greetings ? ?had ? ?hadn’t ? ?happens ? ?hardly ? ?

has ? ?hasn’t ? ?have ? ?haven’t ? ?having ? ?

he ? ?he’s ? ?hello ? ?help ? ?hence ? ?

her ? ?here ? ?here’s ? ?hereafter ? ?hereby ? ?

herein ? ?hereupon ? ?hers ? ?herself ? ?hi ? ?

him ? ?himself ? ?his ? ?hither ? ?hopefully ? ?

how ? ?howbeit ? ?however ? ?i’d ? ?i’ll ? ?

i’m ? ?i’ve ? ?ie ? ?if ? ?ignored ? ?

immediate ? ?in ? ?inasmuch ? ?inc ? ?indeed ? ?

indicate ? ?indicated ? ?indicates ? ?inner ? ?insofar ? ?

instead ? ?into ? ?inward ? ?is ? ?isn’t ? ?

it ? ?it’d ? ?it’ll ? ?it’s ? ?its ? ?

itself ? ?just ? ?keep ? ?keeps ? ?kept ? ?

know ? ?knows ? ?known ? ?last ? ?lately ? ?

later ? ?latter ? ?latterly ? ?least ? ?less ? ?

lest ? ?let ? ?let’s ? ?like ? ?liked ? ?

likely ? ?little ? ?look ? ?looking ? ?looks ? ?

ltd ? ?mainly ? ?many ? ?may ? ?maybe ? ?

me ? ?mean ? ?meanwhile ? ?merely ? ?might ? ?

more ? ?moreover ? ?most ? ?mostly ? ?much ? ?

must ? ?my ? ?myself ? ?name ? ?namely ? ?

nd ? ?near ? ?nearly ? ?necessary ? ?need ? ?

needs ? ?neither ? ?never ? ?nevertheless ? ?new ? ?

next ? ?nine ? ?no ? ?nobody ? ?non ? ?

none ? ?noone ? ?nor ? ?normally ? ?not ? ?

nothing ? ?novel ? ?now ? ?nowhere ? ?obviously ? ?

of ? ?off ? ?often ? ?oh ? ?ok ? ?

okay ? ?old ? ?on ? ?once ? ?one ? ?

ones ? ?only ? ?onto ? ?or ? ?other ? ?

others ? ?otherwise ? ?ought ? ?our ? ?ours ? ?

ourselves ? ?out ? ?outside ? ?over ? ?overall ? ?

own ? ?particular ? ?particularly ? ?per ? ?perhaps ? ?

placed ? ?please ? ?plus ? ?possible ? ?presumably ? ?

probably ? ?provides ? ?que ? ?quite ? ?qv ? ?

rather ? ?rd ? ?re ? ?really ? ?reasonably ? ?

regarding ? ?regardless ? ?regards ? ?relatively ? ?respectively ? ?

right ? ?said ? ?same ? ?saw ? ?say ? ?

saying ? ?says ? ?second ? ?secondly ? ?see ? ?

seeing ? ?seem ? ?seemed ? ?seeming ? ?seems ? ?

seen ? ?self ? ?selves ? ?sensible ? ?sent ? ?

serious ? ?seriously ? ?seven ? ?several ? ?shall ? ?

she ? ?should ? ?shouldn’t ? ?since ? ?six ? ?

so ? ?some ? ?somebody ? ?somehow ? ?someone ? ?

something ? ?sometime ? ?sometimes ? ?somewhat ? ?somewhere ? ?

soon ? ?sorry ? ?specified ? ?specify ? ?specifying ? ?

still ? ?sub ? ?such ? ?sup ? ?sure ? ?

t’s ? ?take ? ?taken ? ?tell ? ?tends ? ?

th ? ?than ? ?thank ? ?thanks ? ?thanx ? ?

that ? ?that’s ? ?thats ? ?the ? ?their ? ?

theirs ? ?them ? ?themselves ? ?then ? ?thence ? ?

there ? ?there’s ? ?thereafter ? ?thereby ? ?therefore ? ?

therein ? ?theres ? ?thereupon ? ?these ? ?they ? ?

they’d ? ?they’ll ? ?they’re ? ?they’ve ? ?think ? ?

third ? ?this ? ?thorough ? ?thoroughly ? ?those ? ?

though ? ?three ? ?through ? ?throughout ? ?thru ? ?

thus ? ?to ? ?together ? ?too ? ?took ? ?

toward ? ?towards ? ?tried ? ?tries ? ?truly ? ?

try ? ?trying ? ?twice ? ?two ? ?un ? ?

under ? ?unfortunately ? ?unless ? ?unlikely ? ?until ? ?

unto ? ?up ? ?upon ? ?us ? ?use ? ?

used ? ?useful ? ?uses ? ?using ? ?usually ? ?

value ? ?various ? ?very ? ?via ? ?viz ? ?

vs ? ?want ? ?wants ? ?was ? ?wasn’t ? ?

way ? ?we ? ?we’d ? ?we’ll ? ?we’re ? ?

we’ve ? ?welcome ? ?well ? ?went ? ?were ? ?

weren’t ? ?what ? ?what’s ? ?whatever ? ?when ? ?

whence ? ?whenever ? ?where ? ?where’s ? ?whereafter ? ?

whereas ? ?whereby ? ?wherein ? ?whereupon ? ?wherever ? ?

whether ? ?which ? ?while ? ?whither ? ?who ? ?

who’s ? ?whoever ? ?whole ? ?whom ? ?whose ? ?

why ? ?will ? ?willing ? ?wish ? ?with ? ?

within ? ?without ? ?won’t ? ?wonder ? ?would ? ?

would ? ?wouldn’t ? ?yes ? ?yet ? ?you ? ?

you’d ? ?you’ll ? ?you’re ? ?you’ve ? ?your ? ?

yours ? ?yourself ? ?yourselves ? ?zero ? ?

4.?全文限定條件

全文搜索只適用于?MyISAM?表。

全文搜索可以同大多數(shù)多字節(jié)字符集一起使用。Unicode屬于例外情況;??可使用utf8?字符集?,?而非ucs2字符集。

諸如漢語(yǔ)和日語(yǔ)這樣的表意語(yǔ)言沒(méi)有自定界符。因此,?FULLTEXT分析程序不能確定在這些或其它的這類(lèi)語(yǔ)言中詞的起始和結(jié)束的位置。

若支持在一個(gè)單獨(dú)表中使用多字符集,則所有?FULLTEXT索引中的列 必須使用同樣的字符集和庫(kù)。

MATCH()列列表必須同該表中一些?FULLTEXT索引定義中的列列表完全符合,除非MATCH()在IN BOOLEAN MODE。

對(duì)AGAINST()?的參數(shù)必須是一個(gè)常數(shù)字符串。

5.?微調(diào)MySQL全文搜索

MySQL的全文搜索容量幾乎不具有用戶(hù)調(diào)節(jié)參數(shù)。假如你擁有一個(gè)?MySQL源分布,你就能對(duì)全文搜索性能行使更多控制,原因是一些變化需要源代碼修改。

注意,為了更加有效,需要對(duì)全文搜索謹(jǐn)慎調(diào)節(jié)。實(shí)際上,在大多數(shù)情況下修改默認(rèn)性能只能降低其性能。?除非你知道自己在做什么,否則不要改變?MySQL源。?

下述的大多數(shù)全文變量必須在服務(wù)器啟動(dòng)時(shí)被設(shè)置。為了改變它們,還要重新啟動(dòng)服務(wù)器;在服務(wù)器正在運(yùn)行期間,他們不會(huì)被改變。

一些變量的改變需要你重建表中的?FULLTEXT?索引。本章結(jié)尾部分給出了其有關(guān)操作說(shuō)明。

ft_min_word_len and ft_max_word_len系統(tǒng)自變量規(guī)定了被編入索引單詞的最小長(zhǎng)度和最大長(zhǎng)度。?默認(rèn)的最小值為四個(gè)字符;默認(rèn)的最大值取決于使用的?MySQL?版本。假如你改變?nèi)我庖粋€(gè)值,那么你必須重建你的?FULLTEXT索引。 例如,若你希望一個(gè)3字符的單詞變?yōu)榭刹檎翼?xiàng),則可以通過(guò)將以下行移動(dòng)到一個(gè)供選擇文件里,從而設(shè)置?ft_min_word_len?變量:

· [mysqld]

· ft_min_word_len=3

然后重新啟動(dòng)服務(wù)器,重建你的?FULLTEXT索引。同時(shí)還要特別注意該表后面的說(shuō)明中的關(guān)于myisamchk的注釋。

若要覆蓋默認(rèn)停止字,則可設(shè)置?ft_stopword_file?系統(tǒng)變量。?變量值應(yīng)為包含停止字的文件路徑名,?或是用來(lái)截止禁用詞過(guò)濾的空字符串。在改變了這個(gè)變量的值或禁用詞文件的內(nèi)容后,?重建你的?FULLTEXT索引。

停止字是自由形態(tài)的,換言之,你可使用任何諸如newline、?space或comma這樣的非字母數(shù)字字符來(lái)分隔禁用詞。 下劃線(xiàn)字符(_)?和被視為單詞的一部分的單引號(hào)?(‘)例外。停止字字符集為服務(wù)器默認(rèn)字符集。

?自然語(yǔ)言查詢(xún)的50%閾值由所選擇的特別權(quán)衡方案所決定。若要阻止它,myisam/ftdefs.h?中尋找以下行:

· #define GWS_IN_USE GWS_PROB

將該行改為:

#define GWS_IN_USE GWS_FREQ

然后重新編譯?MySQL。此時(shí)不需要重建索引。注釋?zhuān)哼@樣做你會(huì)嚴(yán)重的By?降低?MySQL為MATCH()函數(shù)提供合適的相關(guān)值得能力。假如你爭(zhēng)得需要搜索這樣的普通詞,而使用IN BOOLEAN MODE代替的效果更好,因?yàn)樗蛔裱?50%?閾值。

要改變用于布爾全文搜索的操作符,設(shè)置?ft_boolean_syntax?系統(tǒng)變量。 這個(gè)變量也可以在服務(wù)器運(yùn)行時(shí)被改變,但你必須有SUPER?特權(quán)才能這么做。在這種情況下不需要重建索引。

假如你改變了影響索引的全文變量?(ft_min_word_len、?ft_max_word_len或ft_stopword_file),或假如你改變了禁用詞文件本身,則你必須在改變和重新啟動(dòng)服務(wù)器后重建你的?FULLTEXT索引。這時(shí),要重建索引, 只需進(jìn)行一個(gè)?QUICK?修理操作:

mysql>?REPAIR TABLE?tbl_name?QUICK;

注意,假如你使用??myisamchk?來(lái)執(zhí)行一項(xiàng)修改表索引的操作?(諸如修理或分析?),?則使用最小單詞長(zhǎng)度和最大單詞長(zhǎng)度以及停止字的默認(rèn)全文參數(shù)值重建FULLTEXT索引,除非你已另外指定。這會(huì)導(dǎo)致問(wèn)詢(xún)失敗。

發(fā)生這個(gè)問(wèn)題的原因是只有服務(wù)器認(rèn)識(shí)這些參數(shù)。它們的存儲(chǔ)位置不在? MyISAM?索引文件中。若你已經(jīng)修改了最小單詞長(zhǎng)度或最大單詞長(zhǎng)度或服務(wù)器中的停止字,為避免這個(gè)問(wèn)題,為你對(duì)mysqld所使用的myisamchk?指定同樣的ft_min_word_len、?ft_max_word_len和ft_stopword_file值。例如,假如你已經(jīng)將最小單詞長(zhǎng)度設(shè)置為?3,?則你可以這樣修改一個(gè)帶有myisamchk的表:

shell>?myisamchk –recover –ft_min_word_len=3?tbl_name.MYI

為保證?myisamchk?及服務(wù)器對(duì)全文參數(shù)使用相同的值, 可將每一項(xiàng)都放在供選文件中的?[mysqld]和?[myisamchk]?部分:

[mysqld]

ft_min_word_len=3

[myisamchk]

ft_min_word_len=3

使用?REPAIR TABLE、?ANALYZE TABLE、OPTIMIZE TABLE或ALTER TABLE來(lái)代替使用?myisamchk?。這些語(yǔ)句通過(guò)服務(wù)器來(lái)執(zhí)行,服務(wù)器知道使用哪個(gè)全文參數(shù)值更加合適。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊11 分享