MySQL支持全文本搜索的另外一种形式,称为布尔方式(booleanmode)。以布尔方式,可以提供关于如下内容的细节:
要匹配的词;
1.要排斥的词(如果某行包含这个词,则不返回该行,即使它包含其他指定的词也是如此);
2.排列提示(指定某些词比其他词更重要,更重要的词等级更高);
3.表达式分组;
4.另外一些内容。
即使没有 FULLTEXT 索引也可以使用 布尔方式不同于迄今为止使用的全文本搜索语法的地方在于,即使没有定义FULLTEXT 索引,也可以使用它。但这是一种非常缓慢的操作(其性能将随着数据量的增加而降低)。
为演示 IN BOOLEAN MODE 的作用,举一个简单的例子:
输入:
select note_text from productnotes where match(note_text) against('anvils' in boolean mode);
输出:
分析:此全文本搜索检索包含词 heavy 的所有行(有两行)。其中使用了关键字 IN BOOLEAN MODE ,但实际上没有指定布尔操作符,因此,其结果与没有指定布尔方式的结果相同。
IN BOOLEAN MODE 的行为差异 虽然这个例子的结果与没有IN BOOLEAN MODE 的相同,但其行为有一个重要的差别(即使在这个特殊的例子没有表现出来)。
为了匹配包含 heavy 但不包含任意以 rope 开始的词的行,可使用以下查询:
输入:
select note_text from productnotes where match(note_text) against('heavy -rope' in boolean mode);
输出:
分析:这次只返回一行。这一次仍然匹配词 heavy ,但 -rope* 明确地指示MySQL排除包含 rope* (任何以 rope 开始的词,包括ropes )的行,这就是为什么上一个例子中的第一行被排除的原因。
在MySQL 4.x中所需的代码更改 如果你使用的是MySQL4.x,则上面的例子可能不返回任何行。这是 * 操作符处理中的一个错误。为在MySQL 4.x中使用这个例子,使用 -ropes 而不是 -rope* (排除 ropes 而不是排除任何以 rope 开始的词)。
我们已经看到了两个全文本搜索布尔操作符 - 和 * ,-排除一个词,而 *是截断操作符(可想象为用于词尾的一个通配符)。下表列出支持的所有布尔操作符。
下面举几个例子,说明某些操作符如何使用:
输入:
select note_text from productnotes where match(note_text) against('+rabbit +bait' in boolean mode);
分析:这个搜索匹配包含词 rabbit 和 bait 的行。
输入:
select note_text from productnotes where match(note_text) agains('rabbit bait' in boolean mode);
分析:没有指定操作符,这个搜索匹配包含 rabbit 和 bait 中的至少一个词的行。
输入:
select note_text from productnotes where match(note_text) agains('"rabbit bait"' in boolean mode);
分析:这个搜索匹配短语 rabbit bait 而不是匹配两个词 rabbit 和bait 。
输入:
select note_text from productnotes where match(note_text) agains('>rabbit <bcarrot' in boolean mode);
分析:匹配 rabbit 和 carrot ,增加前者的等级,降低后者的等级。
输入:
select note_text from productnotes where match(note_text) agains('+safe +(<combination)' in boolean mode);
分析:这个搜索匹配词 safe 和 combination ,降低后者的等级。
排列而不排序 在布尔方式中,不按等级值降序排序返回的行。
以上是mysql布尔文本搜索教程的详细内容。更多信息请关注PHP中文网其他相关文章!