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> SELECT film_id, title, RIGHT(description, 25)
- -> FROM sakila.film_text
- -> WHERE MATCH(title, description)
- -> AGAINST('+factory +casualties' IN BOOLEAN MODE);
- +---------+---------------------+---------------------------+
- | film_id | title | right(description, 25) |
- +---------+---------------------+---------------------------+
- | 831 | SPIRITED CASUALTIES | a Car in A Baloon Factory |
- +---------+---------------------+---------------------------+
也可以把单词用引号引起来,执行短语搜索,这要求精确匹配该短语。
- mysql> SELECT film_id, title, RIGHT(description, 25)
- -> FROM sakila.film_text
- -> WHERE MATCH(title, description)
- -> AGAINST('"spirited casualties"' IN BOOLEAN MODE);
- +---------+---------------------+---------------------------+
- | film_id | title | right(description, 25) |
- +---------+---------------------+---------------------------+
- | 831 | SPIRITED CASUALTIES | a Car in A Baloon Factory |
- +---------+---------------------+---------------------------+
短语搜索很慢。只靠全文索引无法响应这种搜索,因为索引没有在原始的全文集合中记录单词之间的相对位置。这样造成的结果就是服务器不得不到行内部去执行单词搜索。
为了执行这种搜索,服务器将会查找所有含有"spirited"和"casualties"的文档。然后它会从这些文档中提取行,并且精确地匹配该短语。因为它使用了索引查找最开始使用的文档,所以你可能认为这会很快,至少比LIKE *** 作快得多。实际上,只要该短语并不常见,而且不会返回很多结果,它确实很快。如果短语非常常见,LIKE实际会快一些,因为它会顺序读取数据,而不会使用索引排序的二次算法,并且它根本就不需要读取全文索引。
布尔全文搜索实际不需要全文索引。如果有全文索引的话,它就会使用索引,如果没有的话,它就会扫描整个表。甚至可以对多个表使用布尔全文搜索,例如对联接的结果进行搜索。但是在所有的情况下,它都很慢。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)