5.8.2 布尔全文搜索
Boolean Full-Text Searches
在布尔搜索中,查询自身定义了匹配单词的相对相关性。布尔搜索使用了停用词表(Stopword List)来过滤无用的单词,但是要禁用单词的长度必须大于ft_min_word_len且小于ft_max_word_len这一选项。布尔搜索的结果是没有排序的。
在构造一个布尔搜索查询的时候,可以使用前缀来修改搜索字符串中每个关键词的相对排名。最常用的修饰符在表5-3中。
表5-3:布尔全文搜索常用修饰符
也可以使用其他的操作符,比如使用括号进行分组。可以用这种方式构造复杂的搜索。
还是举一个例子,仍然搜索sakila.film_text表,找到含有"factory"和"casualties"的电影。自然语言搜索会返回含有其中一个单词或包含了这两个单词的结果。但是,这儿使用的布尔搜索要求结果同时包含这两个单词:
- mysql>SELECTfilm_id,title,RIGHT(description,25)
- ->FROMsakila.film_text
- ->WHEREMATCH(title,description)
- ->AGAINST('+factory+casualties'INBOOLEANMODE);
- +---------+---------------------+---------------------------+
- |film_id|title|right(description,25)|
- +---------+---------------------+---------------------------+
- |831|SPIRITEDCASUALTIES|aCarinABaloonFactory|
- +---------+---------------------+---------------------------+
也可以把单词用引号引起来,执行短语搜索,这要求精确匹配该短语。
- mysql>SELECTfilm_id,title,RIGHT(description,25)
- ->FROMsakila.film_text
- ->WHEREMATCH(title,description)
- ->AGAINST('"spiritedcasualties"'INBOOLEANMODE);
- +---------+---------------------+---------------------------+
- |film_id|title|right(description,25)|
- +---------+---------------------+---------------------------+
- |831|SPIRITEDCASUALTIES|aCarinABaloonFactory|
- +---------+---------------------+---------------------------+
短语搜索很慢。只靠全文索引无法响应这种搜索,因为索引没有在原始的全文集合中记录单词之间的相对位置。这样造成的结果就是服务器不得不到行内部去执行单词搜索。
为了执行这种搜索,服务器将会查找所有含有"spirited"和"casualties"的文档。然后它会从这些文档中提取行,并且精确地匹配该短语。因为它使用了索引查找最开始使用的文档,所以你可能认为这会很快,至少比LIKE操作快得多。实际上,只要该短语并不常见,而且不会返回很多结果,它确实很快。如果短语非常常见,LIKE实际会快一些,因为它会顺序读取数据,而不会使用索引排序的二次算法,并且它根本就不需要读取全文索引。
布尔全文搜索实际不需要全文索引。如果有全文索引的话,它就会使用索引,如果没有的话,它就会扫描整个表。甚至可以对多个表使用布尔全文搜索,例如对联接的结果进行搜索。但是在所有的情况下,它都很慢。
评论(0)