MySQL 中的全文搜索:好的、坏的和丑陋的

有时在MySQL数据库中搜索时,您可能希望对基于字符的数据运行全文搜索查询。今天我们正在讨论这种搜索方法的优点和缺点。

MySQL 中的全文搜索是什么?

全文搜索是一种使您能够搜索可能与搜索条件不完全匹配的记录的技术。MySQL中的全文搜索是在使用某些索引时执行的,并且这些索引具有许多独特的细微差别,包括以下内容:

  • 为了使索引被视为全文索引,索引必须是FULLTEXT类型。
  • FULLTEXT 索引只能用于运行 InnoDB 或 MyISAM 存储引擎的表。
  • 只能为CHAR、 VARCHAR或TEXT列创建FULLTEXT索引。
  • FULLTEXT 索引仅在使用MATCH() AGAINST()子句时使用。
  • 全文搜索具有三种模式:自然语言模式、布尔模式和查询扩展模式。

FULLTEXT索引是一种特殊类型的索引,它在文本中查找关键字,而不是将值与索引中的值进行比较。尽管FULLTEXT搜索与其他类型的匹配不同,但请注意,您可以同时在同一列上拥有 BTREE 索引和FULLTEXT索引 - 它们不会冲突,因为它们适用于不同的目的。

全文搜索类型

在MySQL中运行全文搜索时,请记住有三种搜索类型可供选择:

  1. 自然语言搜索类型 - 这种搜索模式将搜索字符串解释为文字短语。如果未指定修饰符或指定IN NATURAL LANGUAGE MODE修饰符,则默认启用;
  2. 查询扩展搜索类型 - 这种搜索模式执行两次搜索。第二次搜索时,结果集包括第一次搜索中最相关的一些文档。使用WITH QUERY EXPANSION修饰符启用;
  3. 布尔搜索类型 - 这种搜索模式可以搜索复杂的查询,这些查询可以包括布尔运算符,例如小于 (“ <”) 和大于 (“>”) 运算符、子表达式 (“(” 和 “)”)、加号 (+)、减号 (-)、双引号 (“”)、降低值对结果的贡献的运算符 (~) 和通配符运算符 (*) - 通配符运算符允许使用模糊匹配进行搜索 (例如,“demo*”也将匹配“demonstration”)。使用 IN BOOLEAN MODE修饰符启用。

使用自然语言搜索模式进行全文搜索

如上所述,自然语言搜索模式默认启用或指定IN NATURAL LANGUAGE MODE修饰符时启用。此模式针对给定的文本集合(一个或多个列)执行自然语言搜索。MySQL全文搜索的基本查询格式应该类似于以下:

1
SELECT * FROM table WHERE MATCH(column) AGAINST(“string” IN NATURAL LANGUAGE MODE);

当MATCH()与WHERE子句一起使用时,行将自动按最高相关性首先排序。要搜索确切的字符串,请用双引号将其括起来。

使用查询扩展模式进行全文搜索

全文搜索还支持查询扩展模式。当用户依赖隐含的知识时,经常使用这种搜索模式——例如,用户可能搜索“DBMS”,希望在搜索结果中同时看到“MongoDB”和“MySQL”。用户在使用这种搜索模式时可能能够依赖一些隐含知识的原因非常简单——带有查询扩展模式的全文搜索通过执行两次搜索来工作:第二个搜索词组是第一个搜索词组与第一次搜索中的一些最相关的条目连接。这意味着,例如,如果在第一次搜索中,其中一行包含单词“DBMS”和单词“MySQL”,那么第二次搜索将找到包含单词“MySQL”的条目,即使它们不包含包含“数据库管理系统”。

1
SELECT * FROM table WHERE MATCH(column) AGAINST(“string” WITH QUERY EXPANSION);

使用布尔模式的全文搜索

布尔模式可能是 MySQL 全文搜索必须提供的最有趣的东西之一。此模式有许多独特的注意事项,因为它允许您使用布尔运算符扩展搜索功能。使用布尔模式时,某些字符可以在单词的开头或结尾具有特殊含义。例如:

  • “ +”表示与;
  • “ -”表示不;
  • “ (” 和 “)” 运算符允许创建子表达式;
  • “ <”和“>”运算符将搜索值的排名降低或提高;
  • “ ~”降低了值对搜索结果的贡献;
  • 双引号( “”)只匹配文字值;
  • “ *”是一个通配符(参考上面的解释)。

这些运算符允许您扩展搜索的功能:例如,如果您想要检索包含单词“Demo”但不包含“Demo2”的所有行,您可以使用如下查询:

1
SELECT * FROM table WHERE MATCH(column) AGAINST (“+Demo -Demo2” IN BOOLEAN MODE);

您还可以将双引号与单引号一起使用,如下所示:

1
SELECT * FROM table WHERE MATCH(column) AGAINST(‘“search string”’ IN BOOLEAN MODE);

全文搜索陷阱

在MySQL中使用全文搜索之前,请记住搜索确实有一些“陷阱”:

  • InnoDB 和 MyISAM 存储引擎都有自己的停用词列表。InnoDB 停用词列表可以在这里找到,MyISAM 停用词列表可以在这里找到。
    • 要为 InnoDB 定义自己的停用词列表,请定义一个与INNODB_FT_DEFAULT_STOPWORD表具有相同结构的表,在其中插入停用词,然后以db_name/table_name的形式设置innodb_ft_server_stopword_table选项的值。
    • 要为 MyISAM 定义自己的停用词列表,请将ft_stopword_file变量设置为包含停用词列表的文件的路径名。在文件中,停用词可以由除“_”和“'”之外的任何非字母数字字符分隔。默认停用词文件位于storage/myisam/ft_static.c。可以通过将变量设置为空字符串来禁用停用词。
  • 分区表不支持全文搜索。
  • FULLTEXT索引中的所有列必须使用相同的字符集和排序规则。
  • 全文搜索操作不将% 字符串视为通配符。

这里还有一个问题:您可能还需要记住,内置的FULLTEXT解析器通过查看某些字符(包括空格(“”)、逗号(“,”)和句点(“.”)来确定单词的开始和结束位置。 ) 表示如果您的搜索字符串包含一个或多个这些字符,则搜索结果可能不准确。例如,如果您的数据库包含 5 行字符串“test.demo”,则搜索查询“test.demo”可能会返回更多(10、15 等)结果,包括“demo”、“string.demo_example”等,因为它会搜索“demo”而不是“test.demo”,因此您可能会遇到很多不相关的匹配项。如果您愿意用 C 或 C++ 编写自己的插件,MySQL 确实提供了解决此问题的方法(请参阅 MySQL 文档),但在那之前,你不能做太多事情。

MySQL 全文限制的完整列表可以在MySQL 的文档页面中查看。

概括

MySQL全文搜索功能提供了一种在运行 MySQL 的应用程序中实现各种搜索技术(自然语言搜索、查询扩展搜索和布尔搜索)的简单方法。这些搜索技术中的每一种都有自己的注意事项,并且它们中的每一种都可能适用于不同的目的 - 在决定是否使用全文搜索时,请记住这种类型的搜索有许多独特的细微之处,了解好处和在MySQL中使用全文搜索并明智地选择的缺点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值