MySQL基礎(chǔ)教程10 — 函數(shù)之全文搜索功能

語法:

  • ?match (col1,col2,…) against (expr [in boolean mode | with query expansion])

MySQL支持全文索引和搜索功能。MySQL中的全文索引類型FULLTEXT的索引。? FULLTEXT?索引僅可用于?MyISAM表;他們可以從CHAR、?VARCHAR或TEXT列中作為CREATE TABLE語句的一部分被創(chuàng)建,或是隨后使用ALTER TABLE?或?CREATE INDEX被添加。對(duì)于較大的數(shù)據(jù)集,將你的資料輸入一個(gè)沒有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í)行資料庫內(nèi)的自然語言搜索。一個(gè)資料庫就是1套1個(gè)或2個(gè)包含在FULLTEXT內(nèi)的列。搜索字符串作為對(duì)AGAINST()的參數(shù)而被給定。對(duì)于表中的每一行, MATCH()?返回一個(gè)相關(guān)值,即,?搜索字符串和?MATCH()表中指定列中該行文字之間的一個(gè)相似性度量。

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

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

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

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

上面的例子基本上展示了怎樣使用返回行的相關(guān)性順序漸弱的MATCH()函數(shù)。而下面的例子則展示了怎樣明確地檢索相關(guān)值。返回行的順序是不定的,原因是? SELECT?語句不包含?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ù)雜。詢問返回相關(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ì)超過一個(gè)。 這意味著?aaa’bbb?會(huì)被視為一個(gè)單詞,而?aaa”bbb則被視為2個(gè)單詞。位于單詞之前或其后的單引號(hào)會(huì)被FULLTEXT分析程序去掉;?‘aaa’bbb’?會(huì)變成?? aaa’bbb。

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

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

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

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

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

這項(xiàng)技術(shù)最適合同大型詞庫一起使用?(事實(shí)上,?此時(shí)它經(jīng)過仔細(xì)的調(diào)整?)。對(duì)于很小的表,單詞分布并不能充分反映它們的語義價(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è)操作最合適不過了—-一個(gè)自然語言問詢不會(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ù)集?而被賦予較低的語義價(jià)值。 一個(gè)給定的詞有可能在一個(gè)數(shù)據(jù)集中擁有超過其50%的域值,而在另一個(gè)數(shù)據(jù)集卻不然。

當(dāng)你第一次嘗試使用全文搜索以了解其工作過程時(shí),這個(gè)50%?的域值提供重要的蘊(yùn)涵操作:若你創(chuàng)建了一個(gè)表,并且只將文章的1、2行插入其中, 而文中的每個(gè)單詞在所有行中出現(xiàn)的機(jī)率至少為? 50%?。那么結(jié)果是你什么也不會(huì)搜索到。一定要插入至少3行,并且多多益善。需要繞過該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è)問詢檢索所有包含單詞“MySQL”的行,但檢索包含單詞“YourSQL”的行。

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

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

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

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

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

  • 停止字適用。

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

  • +

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

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

  • (無操作符)

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

  • >

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

  • ( )

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

  • ~

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

  • *

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

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

若索引中不存在該短語包含的單詞,則結(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”的行?(無先后順序),然而包含 “apple turnover”的行較包含“apple strudel”的行排列等級(jí)更為高。

  • ‘apple*’

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

  • ‘”some words”‘

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

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

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

在下列搜索短語后添加WITH QUERY EXPANSION,激活盲查詢擴(kuò)展功能(即通常所說的自動(dòng)相關(guān)性反饋)。它將執(zhí)行兩次搜索,其中第二次搜索的搜索短語是同第一次搜索時(shí)找到的少數(shù)頂層文件連接的原始搜索短語。這樣,假如這些文件中的一個(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)文件而增加無用信息,因此只有在查詢一個(gè)長(zhǎng)度很短的短語時(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字符集。

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

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

  • 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)操作說明。

  • 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),則可以通過將以下行移動(dòng)到一個(gè)供選擇文件里,從而設(shè)置?ft_min_word_len?變量:

· [mysqld]

· ft_min_word_len=3

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

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

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

  • ?自然語言查詢的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)樗蛔裱?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?來執(zhí)行一項(xiàng)修改表索引的操作?(諸如修理或分析?),?則使用最小單詞長(zhǎng)度和最大單詞長(zhǎng)度以及停止字的默認(rèn)全文參數(shù)值重建FULLTEXT索引,除非你已另外指定。這會(huì)導(dǎo)致問詢失敗。

發(fā)生這個(gè)問題的原因是只有服務(wù)器認(rèn)識(shí)這些參數(shù)。它們的存儲(chǔ)位置不在? MyISAM?索引文件中。若你已經(jīng)修改了最小單詞長(zhǎng)度或最大單詞長(zhǎng)度或服務(wù)器中的停止字,為避免這個(gè)問題,為你對(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來代替使用?myisamchk?。這些語句通過服務(wù)器來執(zhí)行,服務(wù)器知道使用哪個(gè)全文參數(shù)值更加合適。

?以上就是MySQL基礎(chǔ)教程10 —— 函數(shù)之全文搜索功能的內(nèi)容,更多相關(guān)內(nèi)容請(qǐng)關(guān)注PHP中文網(wǎng)(www.php.cn)!

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