MySQL基礎(chǔ)教程10 —— 函數(shù)之全文搜索功能
語(yǔ)法:
MATCH (col1,col2,...) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION])MySQL支持全文索引和搜索功能。MySQL中的全文索引類型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: 0mysql> 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ū)分大小寫方式。然而,你可以通過(guò)對(duì)編入索引的列使用二進(jìn)制排序方式執(zhí)行區(qū)分大小寫的全文搜索。例如,可以向一個(gè)使用latin1字符集的列給定latin1_bin的排序方式,對(duì)于全文搜索區(qū)分大小寫。
如上述所舉例子,當(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)行布爾搜索或使用查詢擴(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ù)雜。詢問(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ù)字和下劃線部分)的序列視為一個(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ù)處理,使其被一些諸如'之類的任意分隔符分隔開(kāi)。
一些詞在全文搜索中會(huì)被忽略:
任何過(guò)于短的詞都會(huì)被忽略。 全文搜索所能找到的詞的默認(rèn)最小長(zhǎng)度為4個(gè)字符。停止字中的詞會(huì)被忽略。禁用詞就是一個(gè)像“the” 或“some” 這樣過(guò)于平常而被認(rèn)為是不具語(yǔ)義的詞。存在一個(gè)內(nèi)置的停止字, 但它可以通過(guò)用戶自定義列表被改寫。詞庫(kù)和詢問(wèn)中每一個(gè)正確的單詞根據(jù)其在詞庫(kù)和詢問(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)詢不會(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%限制的用戶可使用布爾搜索代碼。
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)詢檢索所有包含單詞“MySQL”的行,但不檢索包含單詞“YourSQL”的行。
布爾全文搜索具有以下特點(diǎn):
它們不使用50%域值。.它們不會(huì)按照相關(guān)性漸弱的順序?qū)⑿羞M(jìn)行分類。你可以從上述問(wèn)詢結(jié)果中看到這一點(diǎn):相關(guān)性最高的行是一個(gè)包含兩個(gè)“MySQL” 的行,但它被列在最后的位置,而不是開(kāi)頭位置。即使沒(méi)有FULLTEXT,它們?nèi)匀豢梢怨ぷ鳎M管這種方式的搜索執(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)作很類似。
> <這兩個(gè)操作符用來(lái)改變一個(gè)單詞對(duì)賦予某一行的相關(guān)值的影響。>操作符增強(qiáng)其影響,而<操作符則減弱其影響。請(qǐng)參見(jiàn)下面的例子。
( )括號(hào)用來(lái)將單詞分成子表達(dá)式。括入括號(hào)的部分可以被嵌套。
~一個(gè)前導(dǎo)的代字號(hào)用作否定符, 用來(lái)否定單詞對(duì)該行相關(guān)性的影響。 這對(duì)于標(biāo)記“noise(無(wú)用信息)”的單詞很有用。包含這類單詞的行較其它行等級(jí)低,但因其可能會(huì)和-號(hào)同時(shí)使用,因而不會(huì)在任何時(shí)候都派出所有無(wú)用信息行。
*星號(hào)用作截?cái)喾?。于其它符?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 <strudel)’尋找包含單詞“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.全文搜索帶查詢擴(kuò)展全文搜索支持查詢擴(kuò)展功能(特別是其多變的“盲查詢擴(kuò)展功能”)。若搜索短語(yǔ)的長(zhǎng)度過(guò)短,那么用戶則需要依靠全文搜索引擎通常缺乏的內(nèi)隱知識(shí)進(jìn)行查詢。這時(shí),查詢擴(kuò)展功能通常很有用。例如,某位搜索 “database” 一詞的用戶,可能認(rèn)為“MySQL”、“Oracle”、“DB2”and“RDBMS”均為符合 “databases”的項(xiàng),因此都應(yīng)被返回。這既為內(nèi)隱知識(shí)。
在下列搜索短語(yǔ)后添加WITH QUERY EXPANSION,激活盲查詢擴(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的書籍,這個(gè)用戶不確定“Maigret”一詞的拼法。若不使用查詢擴(kuò)展而搜索“Megre and the reluctant witnesses” 得到的結(jié)果只能是的“Maigret and the Reluctant Witnesses” 。 而帶有查詢擴(kuò)展的搜索會(huì)在第二遍得到帶有“Maigret”一詞的所有書名。
注釋:盲查詢擴(kuò)展功能很容易返回非相關(guān)文件而增加無(wú)用信息,因此只有在查詢一個(gè)長(zhǎng)度很短的短語(yǔ)時(shí)才有必要使用這項(xiàng)功能。
3.全文停止字以下表列出了默認(rèn)的全文停止字:
a’sableaboutaboveaccordingaccordinglyacrossactuallyafterafterwardsagainagainstain’tallallowallowsalmostalonealongalreadyalsoalthoughalwaysamamongamongstanandanotheranyanybodyanyhowanyoneanythinganywayanywaysanywhereapartappearappreciateappropriatearearen’taroundasasideaskaskingassociatedatavailableawayawfullybebecamebecausebecomebecomesbecomingbeenbeforebeforehandbehindbeingbelievebelowbesidebesidesbestbetterbetweenbeyondbothbriefbutbyc’monc’scamecancan’tcannotcantcausecausescertaincertainlychangesclearlycocomcomecomesconcerningconsequentlyconsiderconsideringcontaincontainingcontainscorrespondingcouldcouldn’tcoursecurrentlydefinitelydescribeddespitediddidn’tdifferentdodoesdoesn’tdoingdon’tdonedowndownwardsduringeacheduegeighteitherelseelsewhereenoughentirelyespeciallyetetcevenevereveryeverybodyeveryoneeverythingeverywhereexexactlyexampleexceptfarfewfifthfirstfivefollowedfollowingfollowsforformerformerlyforthfourfromfurtherfurthermoregetgetsgettinggivengivesgogoesgoinggonegotgottengreetingshadhadn’thappenshardlyhashasn’thavehaven’thavinghehe’shellohelphenceherherehere’shereafterherebyhereinhereuponhersherselfhihimhimselfhishitherhopefullyhowhowbeithoweveri’di’lli’mi’veieifignoredimmediateininasmuchincindeedindicateindicatedindicatesinnerinsofarinsteadintoinwardisisn’titit’dit’llit’sitsitselfjustkeepkeepskeptknowknowsknownlastlatelylaterlatterlatterlyleastlesslestletlet’slikelikedlikelylittlelooklookinglooksltdmainlymanymaymaybememeanmeanwhilemerelymightmoremoreovermostmostlymuchmustmymyselfnamenamelyndnearnearlynecessaryneedneedsneitherneverneverthelessnewnextninenonobodynonnonenoonenornormallynotnothingnovelnownowhereobviouslyofoffoftenohokokayoldononceoneonesonlyontoorotherothersotherwiseoughtouroursourselvesoutoutsideoveroverallownparticularparticularlyperperhapsplacedpleasepluspossiblepresumablyprobablyprovidesquequiteqvratherrdrereallyreasonablyregardingregardlessregardsrelativelyrespectivelyrightsaidsamesawsaysayingsayssecondsecondlyseeseeingseemseemedseemingseemsseenselfselvessensiblesentseriousseriouslysevenseveralshallsheshouldshouldn’tsincesixsosomesomebodysomehowsomeonesomethingsometimesometimessomewhatsomewheresoonsorryspecifiedspecifyspecifyingstillsubsuchsupsuret’staketakentelltendsththanthankthanksthanxthatthat’sthatsthetheirtheirsthemthemselvesthenthencetherethere’sthereaftertherebythereforethereintheresthereuponthesetheythey’dthey’llthey’rethey’vethinkthirdthisthoroughthoroughlythosethoughthreethroughthroughoutthruthustotogethertootooktowardtowardstriedtriestrulytrytryingtwicetwoununderunfortunatelyunlessunlikelyuntiluntoupuponususeusedusefulusesusingusuallyvaluevariousveryviavizvswantwantswaswasn’twaywewe’dwe’llwe’rewe’vewelcomewellwentwereweren’twhatwhat’swhateverwhenwhencewheneverwherewhere’swhereafterwhereaswherebywhereinwhereuponwhereverwhetherwhichwhilewhitherwhowho’swhoeverwholewhomwhosewhywillwillingwishwithwithinwithoutwon’twonderwouldwouldwouldn’tyesyetyouyou’dyou’llyou’reyou’veyouryoursyourselfyourselveszero4.全文限定條件全文搜索只適用于MyISAM表。全文搜索可以同大多數(shù)多字節(jié)字符集一起使用。Unicode屬于例外情況;可使用utf8字符集,而非ucs2字符集。諸如漢語(yǔ)和日語(yǔ)這樣的表意語(yǔ)言沒(méi)有自定界符。因此,F(xiàn)ULLTEXT分析程序不能確定在這些或其它的這類語(yǔ)言中詞的起始和結(jié)束的位置。若支持在一個(gè)單獨(dú)表中使用多字符集,則所有FULLTEXT索引中的列 必須使用同樣的字符集和庫(kù)。MATCH()列列表必須同該表中一些FULLTEXT索引定義中的列列表完全符合,除非MATCH()在IN BOOLEAN MODE。對(duì)AGAINST()的參數(shù)必須是一個(gè)常數(shù)字符串。5.微調(diào)MySQL全文搜索MySQL的全文搜索容量幾乎不具有用戶調(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)分隔禁用詞。 下劃線字符(_)和被視為單詞的一部分的單引號(hào)(’)例外。停止字字符集為服務(wù)器默認(rèn)字符集。
自然語(yǔ)言查詢的50%閾值由所選擇的特別權(quán)衡方案所決定。若要阻止它,myisam/ftdefs.h中尋找以下行:· #define GWS_IN_USE GWS_PROB
將該行改為:
#define GWS_IN_USE GWS_FREQ
然后重新編譯MySQL。此時(shí)不需要重建索引。注釋:這樣做你會(huì)嚴(yán)重的By降低MySQL為MATCH()函數(shù)提供合適的相關(guān)值得能力。假如你爭(zhēng)得需要搜索這樣的普通詞,而使用IN BOOLEAN MODE代替的效果更好,因?yàn)樗蛔裱?0%閾值。
要改變用于布爾全文搜索的操作符,設(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 TABLEtbl_nameQUICK;
注意,假如你使用myisamchk來(lái)執(zhí)行一項(xiàng)修改表索引的操作(諸如修理或分析),則使用最小單詞長(zhǎng)度和最大單詞長(zhǎng)度以及停止字的默認(rèn)全文參數(shù)值重建FULLTEXT索引,除非你已另外指定。這會(huì)導(dǎo)致問(wè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=3tbl_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ù)值更加合適。
相關(guān)文章:
1. MySql導(dǎo)出后再導(dǎo)入數(shù)據(jù)時(shí)出錯(cuò)問(wèn)題2. Microsoft Office Access取消主鍵的方法3. Mysql入門系列:在MYSQL結(jié)果集上執(zhí)行計(jì)算4. ORACLE常用傻瓜問(wèn)題1000問(wèn)(之十一)5. Mybatis傳入List實(shí)現(xiàn)批量更新的示例代碼6. 如何安裝MySQL 壓縮包7. Mybatis環(huán)境搭建及文件配置過(guò)程解析8. access數(shù)據(jù)庫(kù)用sql語(yǔ)句添加字段,修改字段,刪除字段9. SELECT...INTO的具體用法10. Microsoft Office Access添加標(biāo)簽控件的方法
