5.8.2 布尔全文搜索 51CTO.COM

5.8.2 布尔全文搜索 - 51CTO.COM

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"的电影。自然语言搜索会返回含有其中一个单词或包含了这两个单词的结果。但是,这儿使用的布尔搜索要求结果同时包含这两个单词:

  1. mysql> SELECT film_id, title, RIGHT(description, 25)  
  2.      -> FROM sakila.film_text  
  3.      -> WHERE MATCH(title, description)  
  4.      ->     AGAINST('+factory +casualties' IN BOOLEAN MODE);  
  5. +---------+---------------------+---------------------------+  
  6. | film_id | title                  | right(description, 25)     |  
  7. +---------+---------------------+---------------------------+  
  8. |      831 | SPIRITED CASUALTIES | a Car in A Baloon Factory |  
  9. +---------+---------------------+---------------------------+ 

也可以把单词用引号引起来,执行短语搜索,这要求精确匹配该短语。

  1. mysql> SELECT film_id, title, RIGHT(description, 25)  
  2.      -> FROM sakila.film_text  
  3.      -> WHERE MATCH(title, description)  
  4.      ->     AGAINST('"spirited casualties"' IN BOOLEAN MODE);  
  5. +---------+---------------------+---------------------------+  
  6. | film_id | title                  | right(description, 25)     |  
  7. +---------+---------------------+---------------------------+  
  8. |      831 | SPIRITED CASUALTIES | a Car in A Baloon Factory |  
  9. +---------+---------------------+---------------------------+ 

短语搜索很慢。只靠全文索引无法响应这种搜索,因为索引没有在原始的全文集合中记录单词之间的相对位置。这样造成的结果就是服务器不得不到行内部去执行单词搜索。

为了执行这种搜索,服务器将会查找所有含有"spirited"和"casualties"的文档。然后它会从这些文档中提取行,并且精确地匹配该短语。因为它使用了索引查找最开始使用的文档,所以你可能认为这会很快,至少比LIKE操作快得多。实际上,只要该短语并不常见,而且不会返回很多结果,它确实很快。如果短语非常常见,LIKE实际会快一些,因为它会顺序读取数据,而不会使用索引排序的二次算法,并且它根本就不需要读取全文索引。

布尔全文搜索实际不需要全文索引。如果有全文索引的话,它就会使用索引,如果没有的话,它就会扫描整个表。甚至可以对多个表使用布尔全文搜索,例如对联接的结果进行搜索。但是在所有的情况下,它都很慢。

原文地址:https://www.cnblogs.com/lexus/p/2541424.html