并非所有引擎都支持全文本搜索 MySQL支持几种基本的数据库引擎。并非所有的引擎都支持本书所描述的全文本搜索。两个最常使用的引擎为MyISAM和InnoDB,前者支持全文本搜索,而后者不支持。这就是为什么虽然本书中 创 建 的 多 数 样 例 表 使 用 InnoDB , 而 有 一 个 样 例 表( productnotes表)却使用MyISAM的原因。如果你的应用中需要全文本搜索功能,应该记住这一点。 LIKE关键字和正则表达式虽然这些搜索机制非常有用,但存在几个重要的限制。 MySQL创建指定列中各词的一个索引,搜索可以针对这些词进行。这样, MySQL可以快速有效地决定哪些词匹配(哪些行包含它们),哪些词不匹配,它们匹配的频率,等等。 一般在创建表时启用全文本搜索。 CREATE TABLE语句接受FULLTEXT子句,它给出被索引列的一个逗号分隔的列表。 可以在创建表时指定FULLTEXT,或者在稍后指定。 不要在导入数据时使用FULLTEXT 更新索引要花时间,虽然不是很多,但毕竟要花时间。如果正在导入数据到一个新表,此时不应该启用FULLTEXT索引。应该首先导入所有数据,然后再修改表, 定义FULLTEXT。 这样有助于更快地导入数据 在索引之后,使用两个函数Match()和Against()执行全文本搜索,其中Match()指定被搜索的列, Against()指定要使用的搜索表达式。 使用完整的Match() 说明传递给 Match() 的值必须与FULLTEXT()定义中的相同。如果指定多个列,则必须列出它们(而且次序正确)。 上述两条SELECT语句都不包含ORDER BY子句。后者(使用LIKE)以不特别有用的顺序返回数据。前者(使用全文本搜索)返回以文本匹配的良好程度排序的数据。两个行都包含词rabbit,但包含词rabbit作为第3个词的行的等级比作为第20个词的行高。这很重要。全文本搜索的一个重要部分就是对结果排序。具有较高等级的行先返回(因为这些行很可能是你真正想要的行)。 在使用查询扩展时, MySQL对数据和索引进行两遍扫描来完成搜索: 行越多越好 表中的行越多(这些行中的文本就越多),使用查询扩展返回的结果越好。 MySQL支持全文本搜索的另外一种形式,称为布尔方式( boolean mode)。 即使没有FULLTEXT索引也可以使用 布尔方式不同于迄今为止使用的全文本搜索语法的地方在于, 即使没有定义FULLTEXT索引,也可以使用它。但这是一种非常缓慢的操作(其性能将随着数据量的增加而降低)。 以布尔方式,可以提供关于如下内容的细节: 为了匹配包含heavy但不包含任意以rope开始的词的行, 可使用以下查询: 便包含或排除这个短语) 排列而不排序 在布尔方式中,不按等级值降序排序返回的行。 这个搜索匹配包含词rabbit和bait的行。
18.1 理解全文本搜索
18.2 使用全文本搜索
18.2.1 启用全文本搜索支持
下面的CREATE语句演示了FULLTEXT子句的使用:
18.2.2 进行全文本搜索
mysql> SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit'); +-----------------------------------------------------------------------------------------------------------------------+ | note_text | +-----------------------------------------------------------------------------------------------------------------------+ | Customer complaint: rabbit has been able to detect trap, food apparently less effective now. | | Quantity varies, sold by the sack load. All guaranteed to be bright and orange, and suitable for use as rabbit bait. | +-----------------------------------------------------------------------------------------------------------------------+
搜索不区分大小写 除非使用BINARY方式(本章中没有介绍),否则全文本搜索不区分大小写。
排序多个搜索项 如果指定多个搜索项,则包含多数匹配词的那些行将具有比包含较少词(或仅有一个匹配)的那些行高的等级值。mysql> SELECT note_text FROM productnotes WHERE note_text LIKE '%rabbit%'; +-----------------------------------------------------------------------------------------------------------------------+ | note_text | +-----------------------------------------------------------------------------------------------------------------------+ | Quantity varies, sold by the sack load. All guaranteed to be bright and orange, and suitable for use as rabbit bait. | | Customer complaint: rabbit has been able to detect trap, food apparently less effective now. | +-----------------------------------------------------------------------------------------------------------------------+
出现这种情况)。18.2.3 使用查询扩展
行;
要地解释MySQL如何断定什么有用,什么无用)。
而且还使用所有有用的词。mysql> SELECT note_text FROM productnotes WHERE Match(note_text) Against('anvils' WITH QUERY EXPANSION); +----------------------------------------------------------------------------------------------------------------------------------------------------------+ | note_text | +----------------------------------------------------------------------------------------------------------------------------------------------------------+ | Multiple customer returns, anvils failing to drop fast enough or falling backwards on purchaser. Recommend that customer considers using heavier anvils. | | Customer complaint: Sticks not individually wrapped, too easy to mistakenly detonate all at once. Recommend individual wrapping. | | Customer complaint: Not heavy enough to generate flying stars around head of victim. If being purchased for dropping, recommend ANV02 or ANV03 instead. | | Please note that no returns will be accepted if safe opened using explosives. | | Customer complaint: rabbit has been able to detect trap, food apparently less effective now. | | Customer complaint: Circular hole in safe floor can apparently be easily cut with handsaw. | | Matches not included, recommend purchase of matches or detonator (item DTNTR). | +----------------------------------------------------------------------------------------------------------------------------------------------------------+
18.2.4 布尔文本搜索
其他指定的词也是如此);mysql> SELECT note_text FROM productnotes WHERE Match(note_text) Against('heavy -rope*' IN BOOLEAN MODE); +----------------------------------------------------------------------------------------------------------------------------------------------------------+ | note_text | +----------------------------------------------------------------------------------------------------------------------------------------------------------+ | Customer complaint: Not heavy enough to generate flying stars around head of victim. If being purchased for dropping, recommend ANV02 or ANV03 instead. | +----------------------------------------------------------------------------------------------------------------------------------------------------------+
-rope*
明确地指示MySQL排除包含rope*
(任何以rope开始的词,包括ropes)的行。
布尔操作符
说 明
+
包含,词必须存在
–
排除,词必须不出现
>
包含,而且增加等级值
<
包含,且减少等级值
()
把词组成子表达式(允许这些子表达式作为一个组被包含、排除、排列等)
~
取消一个词的排序值
*
词尾的通配符
“”
定义一个短语(与单个词的列表不一样,它匹配整个短语以
mysql> SELECT note_text FROM productnotes WHERE Match(note_text) Against('+rabbit +bbit' IN BOOLEAN MODE);
mysql> SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit bbit' IN BOOLEAN MODE);
个词的行。mysql> SELECT note_text FROM productnotes WHERE Match(note_text) Against('"rabbit bbit"' IN BOOLEAN MODE);
mysql> SELECT note_text FROM productnotes WHERE Match(note_text) Against('>rabbit <carrot' IN BOOLEAN MODE);
mysql> SELECT note_text FROM productnotes WHERE Match(note_text) Against('+safe +(<combination)' IN BOOLEAN MODE);
18.2.5 全文本搜索的使用说明
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算