全文本搜索

  • MyISAM支持全文本搜索
  • InnoDB不支持

    为什么使用全文本搜索?

  • 性能

  • 明确控制——使用表达式和通配符很难明确控制匹配什么和不匹配什么
  • 更加智能化——用like不会区别包含单个匹配的行和包含多个匹配的行

    使用全文本搜索

    启用全文本搜索支持

    一般在创建时启用全文本搜索
    FULLTEXT语句
    全文本搜索 - 图1
    FULLTEXT(note_text)表示对note_text进行索引
    增减删除行时索引会自动更新

    进行全文本搜索

    使用Match()和Against()

  • Match()指定搜索的列

  • Against()指定搜索的表达式

SELECT note_text FROM productnotes WHERE MATCH(note_text) AGAINST (‘rabbit’)
全文本搜索 - 图2

注意

Match()的值必须与FULLTEXT列出的相同
全文本搜索很重要的一点就是会对结果进行排序,具有较高等级的行先返回
SELECT note_text ,MATCH(note_text) AGAINST (‘rabbit’) AS rank FROM productnotes
全文本搜索 - 图3

使用查询扩展

WITH QUERY EXPANSION
查询扩展的过程

  • 进行基本的全文搜索,找到与搜索条件匹配的所有行
  • MySQL检测这些匹配行并选择有用的词
  • MySQL再次进行全文搜索,使用所有有用的词

    不适用查询扩展

    SELECT note_text FROM productnotes WHERE MATCH(note_text) AGAINST (‘anvils’)
    全文本搜索 - 图4

    使用查询扩展

    SELECT note_text FROM productnotes WHERE MATCH(note_text) AGAINST (‘anvils’ WITH QUERY EXPANSION)
    全文本搜索 - 图5

    布尔文本搜索