MySQL全文本搜索 扩展搜索 布尔搜索 FULLTEXT

总结:

  1. 全文本搜索Match(FULLTEXT) Against(‘text’)。注意FULLTEXT索引要在导完数据后再定义FULLTEXT是哪(些)列,否则很耗时。
  2. 全文本搜索结果输出会按相关性排列。
  3. 扩展查询Against(‘text’ WITH QUERY EXPANSION):可查到更多输入关键词相关的行,但是有可能会增加很多不需要的行。
  4. 布尔文本搜索Against(‘text’ IN BOOLEAN MODE):可排斥不包含这个词的行;按某种顺序排列;表达式分组等。没有FULLTEXT索引也可以用,但性能随数据量增加而降低;全文本布尔操作符。排列而不排序。
  5. 忽略词:字符长度<3;stopword;高频词(>50%);表行数<3;单引号。
  6. 没有分隔词的语言不适用全文本搜索,如汉语日语。
  7. 只有MyISAM支持全文本搜索。

 

两个最常使用引擎:InnoDB和MyISAM

其中,InnoDB不支持全文本搜索。只有MyISAM支持,注意!

 

LIKE通配符只能匹配已知包含此文本的行,正则化匹配可查找更加复杂的匹配模式。

通配符博客地址:https://blog.csdn.net/m0_38061639/article/details/82833196

正则化匹配博客地址:https://blog.csdn.net/m0_38061639/article/details/82845461

但LIKE通配符和正则化匹配仍存在一些限制

  1. 匹配表中所有行,非常耗时;
  2. 很难明确匹配或不匹配什么;
  3. 不太智能,如不能返回与搜索词相关的此,不区分包括单个匹配的行或包括多个匹配的行,以及排序等问题,

 

全文本搜索可解决上述限制。建立FULLTEXT索引,提高效率。

 

1. 利用全文本搜索Match(index) Against(text)查询:

传递给Match()的值必须与FULLTEXT()中的相同,即Match括号中必须是FULLTEXT,即有索引的列。如果要指定多列,需要按顺序列出。

SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit');

2. WHERE

SELECT note_text FROM productnotes WHERE note_text LIKE '%rabbit%';

3. 输出等级,并按相关等级高低排序

SELECT note_text,Match(note_text) Against('rabbit') as ranks FROM productnotes ORDER BY ranks DESC;

4. 查询扩展

4.1 用简单的WHERE LIKE,只有1条结果

SELECT note_text FROM productnotes WHERE note_text LIKE '%anvils%';

4.2 使用查询扩展

有7行结果,但其实只有第一行包含了anvils这个词,其他行不包括。但第二行包含了第一行的两个词:customer和recommend。

SELECT note_text FROM productnotes

WHERE Match(note_text) Against('anvils' WITH QUERY EXPANSION);

评估查询扩展:返回的行越多,扩展查询越好,但同时也增加了不想要的行。

5. 布尔文本搜索:

布尔方式(Boolean mode),没有FULLTEXT索引也可以用,但是操作很慢。

了解掌握不同布尔操作符的含义。

表来自《MySQL必知必会》第18章

5.1 包含rabbitbait的行

SELECT note_text FROM productnotes

WHERE Match(note_text) Against('rabbit bait' IN BOOLEAN MODE);

5.2  - *

包含heavy,且不包含所有有rope开头的词的行:

SELECT note_text FROM productnotes

WHERE Match(note_text) Against('heavy -rope*' IN BOOLEAN MODE);

5.3 +

必须包含rabbit和bait的行

SELECT note_text FROM productnotes

WHERE Match(note_text) Against('+rabbit +bait' IN BOOLEAN MODE);

5.4 “”

包括短语“rabbit bait”的行

SELECT note_text FROM productnotes

WHERE Match(note_text) Against('"rabbit bait"' IN BOOLEAN MODE);

5.5 ><增加或降低等级

匹配rabbit和carrot,增加前者等级,降低后者等级

SELECT note_text FROM productnotes

WHERE Match(note_text) Against('>rabbit <carrot' IN BOOLEAN MODE);

5.6 ()

降低后者等级

SELECT note_text FROM productnotes

WHERE Match(note_text) Against('+safe +(<combination)' IN BOOLEAN MODE);

6. 全文本搜索的使用说明

  1. <=3个字符短词被忽略。
  2. 内建非用词(stopword)被忽略。
  3. 高频词(>50%,即出现在50%以上的行中)被忽略。(IN BOOLEAN MODE)除外。
  4. 表中行数<3,即只要1或2行的表,全文本搜索不返回结果。
  5. 忽略单引号。如don’t索引为don’t。
  6. 不具有词分隔词的语言不适用(如日语汉语)。
  7. 仅在MyISAM数据库中支持全文本搜索。