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>SELECTfilm_id,title,RIGHT(description,25)
  2. ->FROMsakila.film_text
  3. ->WHEREMATCH(title,description)
  4. ->AGAINST('+factory+casualties'INBOOLEANMODE);
  5. +---------+---------------------+---------------------------+
  6. |film_id|title|right(description,25)|
  7. +---------+---------------------+---------------------------+
  8. |831|SPIRITEDCASUALTIES|aCarinABaloonFactory|
  9. +---------+---------------------+---------------------------+

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

  1. mysql>SELECTfilm_id,title,RIGHT(description,25)
  2. ->FROMsakila.film_text
  3. ->WHEREMATCH(title,description)
  4. ->AGAINST('"spiritedcasualties"'INBOOLEANMODE);
  5. +---------+---------------------+---------------------------+
  6. |film_id|title|right(description,25)|
  7. +---------+---------------------+---------------------------+
  8. |831|SPIRITEDCASUALTIES|aCarinABaloonFactory|
  9. +---------+---------------------+---------------------------+

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

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

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

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。