MySQL全文搜索之布爾搜索
利用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)其影響,而 <操作符則減弱其影響。請(qǐ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)。 【編輯推薦】