MySQL全文搜索:布尔模式
全文搜索的布尔模式可以让我们控制多单词搜索操作中的许多细节。要想进行这种模式的搜索,需要在AGAINST()函数里在搜索字符串的后面加上IN BOOLEAN MODE短语。布尔模式的全文搜索有以下特点。
"50%规则"不再起作用,即使是在超过一半的数据行里出现过的单词也可以被这种搜索匹配出来。
查询结果不再按照相关程度排序。
在搜索一个短语时,你可以要求所有单词必须按照某种特定的顺序出现。如果是搜索一个短语,需要把构成该短语的所有单词用双引号括起来;如果数据行包含的单词按照给定的顺序排列,才被认为是一个匹配。
-
mysql> SELECT * FROM apothegm
-
-> WHERE MATCH(attribution, phrase)
-
-> AGAINST('"bell book and candle"' IN BOOLEAN MODE);
-
+---------------------+------------------------+
-
| attribution | phrase |
-
+---------------------+------------------------+
-
| Miguel de Cervantes | Bell, book, and candle |
-
+---------------------+------------------------+
布尔模式的全文搜索还可以在没被包括在FULLTEXT索引里的数据列上进行,但这要比搜索有FULLTEXT索引的数据列慢很多。
在进行布尔搜索时,还可以给搜索字符串里的单词加上一些修饰符。在单词的前面加上一个加号表示该单词必须出现在匹配数据行里,而加上一个减号表示该单词不得出现在匹配数据行里。比如说,搜索字符串'bell'匹配包含"bell"的数据行,而在布尔模式里,搜索字符串'+bell -candle'只匹配包含单词"bell"、不包含单词"candle"的数据行:
-
mysql> SELECT * FROM apothegm
-
-> WHERE MATCH(attribution, phrase)
-
-> AGAINST('bell');
-
+-----------------------+------------------------------------+
-
| attribution | phrase |
-
+-----------------------+------------------------------------+
-
| Alexander Graham Bell | Mr. Watson, come here. I want you! |
-
| Miguel de Cervantes | Bell, book, and candle |
-
+-----------------------+------------------------------------+
-
mysql> SELECT * FROM apothegm
-
-> WHERE MATCH(attribution, phrase)
-
-> AGAINST('+bell -candle' IN BOOLEAN MODE);
-
+-----------------------+------------------------------------+
-
| attribution | phrase |
-
+-----------------------+------------------------------------+
-
| Alexander Graham Bell | Mr. Watson, come here. I want you! |
-
+-----------------------+------------------------------------+
后缀的星号"*"将被解释为一个通配符,带星号后缀的搜索单词将匹配以它开头的所有单词。比如说,'soft*'将匹配"soft"、"softly"、"softness"等:
-
mysql> SELECT * FROM apothegm WHERE MATCH(phrase)
-
-> AGAINST('soft*' IN BOOLEAN MODE);
-
+---------------------+----------------------------------------------------+
-
| attribution | phrase |
-
+---------------------+----------------------------------------------------+
-
| Proverbs 15:1 | A soft answer turneth away wrath |
-
| William Shakespeare | But, soft! what light through yonder window breaks?|
-
| Theodore Roosevelt | Speak softly and carry a big stick |
-
+---------------------+----------------------------------------------------+
注意,星号通配符不能用来匹配比最小索引单词长度更短的单词。
在附录C里,你可以在介绍MATCH操作符的部分查到全部的布尔模式修饰符。
和自然语言模式的全文搜索情况相似,布尔模式的全文搜索也将忽略所有的休止单词,就算是把它们标为"必须出现"也是如此。比如说,搜索字符串'+Alexander +the +great'将找出包含 "Alexander"和"great"的数据行, "the"会因为它是一个休止单词而被忽略。