MySQL-18全文本搜索-必知必会

MyISAM引擎支持全文本搜索,InnoDB不支持全文本搜索。

之前学习的通配符和正则表达式匹配通常需要MySQL尝试匹配表中的所有行,非常耗时;很难控制匹配什么和不匹配什么;不能提供一种智能化的选择结果的方法。

  • 启动全文本搜索支持

    CREATE TABLE productnoted
    (
        node_id int         NOT NULL AUTO_INCREMENT,
        prod_id char(10)    NOT NULL,
        note_data datetime  NOT NULL,
        note_text text      NULL,
        PRIMARY KEY(note_id),
        FULLTEXT(note_text)
    )ENGINE=MyISAM;
    

    为了进行全文本搜索,MySQL根据FULLTEXT(note_text)的指示对它进行索引,在定义之后MySQL自动维护该索引,在增删改时,索引随之自动更新。

    可以在创建表时指定FULLTEXT,也可以在之后指定。不要在导入数据时使用FULLTEXT,先导入后修改表。

  • 进行全文本搜索

    在索引之后使用Match()和Against()函数执行全文本搜索。

    • Match()指定被搜索的列

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

      SELECT note_text FROM productnoted WHERE Match(note_text) Against('rabbit');
      #此SELECT语句能够检索单个列note_text,通过Against函数指定'rabbit'作为搜索文本,含有该文本的行将被返回/不区分大小写
      
  • 使用查询扩展

    查询扩展用来设法放宽所返回的全文本搜索结果的范围,比如查找与某个词有关的其他行。需要对数据和索引进行两遍扫描

    • 1、进行一个基本的全文本扫描,找出与搜索条件匹配的所有行
    • 2、检查这些匹配并选择所有的词
    • 3、再次进行全文本搜索,原来的条件加上步骤2的所有有用的词
    #下边例子值返回一行包含词'rabbit'
    SELECT note_text FROM productnoted WHERE Match(note_text) Against('rabbit');
    #使用查询扩展,在要查找的词后+WITH QUERY EXPANSION
    SELECT note_text FROM productnoted 
    	WHERE Match(note_text) Against('rabbit' WITH QUERY EXPANSION);
    
  • 布尔文本搜索

    支持全文本搜索的另外一种形式,布尔方式,没有FULLTEXT索引也可以使用,可以提供关于如下内容的细节:

    • 要匹配的词

      #在note_text列检索包含词rabbit的所有行,结果与没有指定布尔操作相同
      SELECT note_text FROM productnoted WHERE Match(note_text) Against('rabbit' IN BOOLEAN MODE);
      #这个搜索匹配包含词rebbit和bait的行
      SELECT note_text FROM productnoted 
      	WHERE Match(note_text) Against('+rabbit +bait' IN BOOLEAN MODE);
      #这个搜索匹配包含两个词至少一个的行
      SELECT note_text FROM productnoted 
      	WHERE Match(note_text) Against('rabbit bait' IN BOOLEAN MODE);
      #这个搜索匹配短语 rabbit bait
      SELECT note_text FROM productnoted 
      	WHERE Match(note_text) Against('"rabbit bait"' IN BOOLEAN MODE);
      
      
    • 要排斥的词

      #匹配包含rabbit但不包含任何以rope开头的词的行。
      SELECT note_text FROM productnoted WHERE 
      	Match(note_text) Against('rabbit -rope*' IN BOOLEAN MODE);
      
    • 排列提醒,指定优先级更高的词

      #这个搜索匹配rabbit和bait,增加前者的等级,降低后者的等级
      SELECT note_text FROM productnoted 
      	WHERE Match(note_text) Against('>rabbit <bait' IN BOOLEAN MODE);
      #这个搜索匹配rabbit和bait,降低后者的等级
      SELECT note_text FROM productnoted 
      	WHERE Match(note_text) Against('+rabbit +(<bait)' IN BOOLEAN MODE);
      
    • 表达式分组

    • 另外一些内容

上一篇:【MOS:1549181.1】为何在查询中索引未被使用--为什么索引没有被使用


下一篇:nRF52-Note(02)-创建第一个工程模板