如何使用MySQL的全文本搜索功能
全本文搜索
- 1.全文本搜索
- 1.1理解全文本搜索
- 2.使用全文搜索
- 2.1启用全文本搜索支持
- 2.2进行全文本搜索
- 2.3使用查询扩展
- 2.4布尔文本搜索
- 2.5全文搜索的使用说明
1.全文本搜索
1.1理解全文本搜索
并非所有引擎都支持全文本搜索
两个最常使用的引擎为MyISAM和InnoDB,前者支持全文本搜索,而后者不支持。这就是为什么虽然本书中创建的多数样例表使用InnoDB,而有一个样例表(productnotes表)却使用MyISAM的原因。
一些搜索机制的限制如下:
- 性能——通配符和正则表达式匹配通常要求MySQL尝试匹配表中所有行(而且这些搜索极少使用表索引)。因此,由于被搜索行数不断增加,这些搜索可能非常耗时。
- 明确控制——使用通配符和正则表达式匹配,很难(而且并不总是能)明确地控制匹配什么和不匹配什么。例如,指定一个词必须匹配,一个词必须不匹配,而一个词仅在第一个词确实匹配的情况下才可以匹配或者才可以不匹配。
- 智能化的结果——虽然基于通配符和正则表达式的搜索提供了非常灵活的搜索,但它们都不能提供一种智能化的选择结果的方法。例如,一个特殊词的搜索将会返回包含该词的所有行,而不区分包含单个匹配的行和包含多个匹配的行(按照可能是更好的匹配来排列它们)。类似,一个特殊词的搜索将不会找出不包含该词但包含其他相关词的行。
所有这些限制以及更多的限制都可以用全文本搜索来解决。
2.使用全文搜索
2.1启用全文本搜索支持
一般在创建表时启用全文本搜索。CREATE TABLE语句接受FULLTEXT子句,它给出被索引列的一个逗号分隔的列表。
下面的 CREATE语句演示了FULL TEXT子句的使用:
输入
CREATE TABLE productnotes
(note_id int NOT NULL AUTO_INCREMENT,prod_id char(10) NOT NULLnote_date datetime NOT NULLnote_text text NULL,PRIMARY KEY(note_id),FULLTEXT(note_text)
) ENGINE = MyISAM;
分析:这条CREATE TABLE语句定义表productnotes并列出它所包含的列。
这些列中有一个名为note_text的列,为了进行全文本搜索,MySQL根据子句FULLTEXT(note_text)的指示对它进行索引。这里的FULLTEXT索引单个列,如果需要也可以指定多个列。
在定义之后,MySQL自动维护该索引。在增加、更新或删除行时,索引随之自动更新。可以在创建表时指定FULLTEXT,或者在稍后指定(在这种情况下所有已有数据必须立即索引)。
2.2进行全文本搜索
在索引之后,使用两个函数Match()和Against()执行全文本搜索,其中Match()指定被搜索的列,Against()指定要使用的搜索表达式。
下面举一个例子:
输入
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('rabbit');
输出
分析:此SELECT语句检索单个列note_text。由于WHERE子句,一个全文本搜索执行。Match(note_text)只是MySQL针对指定的列进行搜索,Against(‘rabbit’)指定此rabbit作为搜索文本。由于两行都包含有词rabbit,这两个都被返回。
使用完整的Match()说明 传递给Match()的值必须与FULLTEXT()定义中的相同。如果指定多个列,则必须列出它们(而且次序正确)。
搜索不区分大小写 除非使用BINARY方式(本章中没有介绍),否则全文本搜索不区分大小写。
事实上刚才的语句可以简单的使用LIKE语句完成,如下:
输入
SELECT note_text
FROM productnotes
WHERE note_text LIKE '%rabbit%';
输出
分析:这条SELECT语句同样检索出两行,但次序不同(虽然并不总是出现这种情况)。上述两条SELECT语句都不包含ORDER BY子句。后者(使用LIKE)以不特别有用的顺序返回数据。前者(使用全文本搜索)返回以文本匹配的良好程度排序的数据。两个行都包含词rabbit,但包含词rabbit作为第3个词的行的等级比作为第20个词的行高。这很重要。
全文本搜索的一个重要部分就是对结果排序。具有较高等级的行先返回(因为这些行很可能是你真正想要的行)。
为演示排序请看下面的例子:
输入
SELECT note_text,Match(note_text) Against('rabbit') AS rank
FROM productnotes;
输出
分析:在SELECT而不是WHERE子句中使用Match()和Against()。这使所有行都被返回(因为没WHERE语句)。Match()和Against()用来建立一个计算列(别名为rank),此列全文搜索计算出来的等级值。等级由MySQL根据词中的数目、喂一词的数目、整个搜索中词的总数以及包含该词的行的数目计算出来。正如所见,不包含rabbit行等级为0。确实包含rabbit的两个行每行都有一个等级值,文本中词靠前的行的等级值比词靠后的等级值高。
这个例子有助于说明全文本搜索如何排除行(排除那些等级为0的行),如何排序结果(按等级以降序排序)。
2.3使用查询扩展
查询扩展用来设法放宽所返回的全文本搜索结果的范围。
你想找出所有提到anvils的注释。只有一个注释包含词anvils,但你还想找出可能与你的搜索有关的所有其他行,即使它们不包含词anvils。 这也是查询扩展的一项任务。
输入
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('anvils' WITH QUERY EXPANSION);
输出
分析:这次返回了7行。第一行包含词anvils,因此等级最高。第二行与anvils无关,但因为它包含第一行中的两个词(customer和recommend),所以也被检索出来。第3行也包含这两个相同的词,但它们在文本中的位置更靠后且分开得更远,因此也包含这一行,但等级为第三。第三行确实也没有涉及anvils(按它们的产品名)。
行越多越好 表中的行越多(这些行中的文本就越多),使用查询扩展返回的结果越好。
2.4布尔文本搜索
MySQL支持全文本搜索的另外一种形式,称为布尔方式(boolean mode)。以布尔方式,可以提供关于如下内容的细节:
- 要匹配的词;
- 要排斥的词(如果某行包含这个词,则不返回该行,即使它包含其他指定的词也是如此);
- 排列提示(指定某些词比其他词更重要,更重要的词等级更高);
- 表达式分组;
- 另外一些内容。
为演示IN BOOLEAN MODE的作用,举一个简单的例子
输入
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('heavy' IN BOOLEAN MODE);
输出
分析:此全文本搜索检索包含词heavy的所有行(有两行)。其中使用了关键字IN BOOLEAN MODE,但实际上没有指定布尔操作符,因此,其结果与没有指定布尔方式的结果相同。
为了匹配包含heavy但不包含任意以rope开始的词的行,可使用以下查询:
输入
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('heavy -rope*' IN BOOLEAN MODE);
输出
分析:这次只返回一行。这一次仍然匹配词heavy,但-rope*明确地指示MySQL排除包含rope*(任何以rope开始的词,包括ropes)的行,这就是为什么上一个例子中的第一行被排除的原因。
全文本布尔操作符
例子如下:
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('+safe +(<combination)' IN BOOLEAN MODE);
分析:这个搜索匹配词safe和combination,降低后者的等级。
2.5全文搜索的使用说明
关于全文本搜索的某些重要的说明:
- 在索引全文本数据时,短词被忽略且从索引中排除。短词定义为那些具有3个或3个以下字符的词(如果需要,这个数目可以更改)。
- MySQL带有一个内建的非用词(stopword)列表,这些词在索引全文本数据时总是被忽略。如果需要,可以覆盖这个列表(请参阅MySQL文档以了解如何完成此工作)。
- 许多词出现的频率很高,搜索它们没有用处(返回太多的结果)。因此,MySQL规定了一条50%规则,如果一个词出现在50%以上的行中,则将它作为一个非用词忽略。50%规则不用于IN BOOLEAN MODE。
- 如果表中的行数少于3行,则全文本搜索不返回结果(因为每个词或者不出现,或者至少出现在50%的行中)。
- 忽略词中的单引号。例如,don’t索引为dont。
- 不具有词分隔符(包括日语和汉语)的语言不能恰当地返回全文本搜索结果。
- 如前所述,仅在MyISAM数据库引擎中支持全文本搜索。
如何使用MySQL的全文本搜索功能相关推荐
- 快速回顾 MySQL:全文本搜索
前提要述:参考书籍<MySQL必知必会> 文章目录 14.1 全文本搜索 14.1.1 启动全文本搜索 14.1.2 使用全文本搜索 14.1.3 使用查询扩展 14.1.4 使用布尔查询 ...
- MySQL(十)操纵表及全文本搜索
一.创建表 MySQL不仅用于表数据操作,还可以用来执行数据库和表的所有操作,包括表本身的创建和处理. 创建表一般有如下两种方式: ①使用具有交互式创建和管理表的工具: ②直接使用MySQL语句操纵表 ...
- 数据库9:联结表 高级联结 组合查询 全文本搜索
第十五章联结表 Sql最强大的功能之一就是能在数据检索查询的执行中联结(join)表.联结是利用sql的select能执行的最重要的操作,能很好的理解联结及其语法是学习sql的一个极为重要的组成部分. ...
- MySql学习之组合查询(UNION)和全文本搜索(Match()和Against())
组合查询 一.何为组合查询? 组合查询的目的就是利用UNION操作符将多条SELECT语句的查询结果组合成一个结果集,供我们使用. 有两种基本情况下需要使用组合查询: 1.在单个查询中从不同的表返回类 ...
- mysql全文本搜索
前言 1️⃣ :mysql环境准备 2️⃣ :简单的表查询 3️⃣ :通配符+正则表达式 4️⃣ :mysql函数与分组 5️⃣ :子查询_联结查询_组合查询 第一部分:我们准备环境:安装数据库+创建 ...
- MySQL数据检索+查询+全文本搜索
[0]README 0.1)本文部分文字描述转自"MySQL 必知必会",旨在review"MySQL数据检索+查询+全文本搜索" 的基础知识: [1]使用子查 ...
- mysql 支持全文搜索_MySQL全文本搜索:启用全文本搜索支持
一般在创建表时启用全文本搜索. CREATE TABLE 语句接受 FULLTEXT 子句,它给出被索引列的一个逗号分隔的列表. 下面的 CREATE 语句演示了 FULLTEXT 子句的使用: 输入 ...
- mysql 学习记录 全文本搜索
第十八章 全文本搜索 mysql最常用的引擎是MYISAM和InnoDb,前者支持全文本搜索,后者不支持. 全文本搜索搜索速度更快,搜索条件更精确,搜索结果更智能化.使用like子句也可以完成,但全文 ...
- 《MySQL必知必会》学习笔记——组合查询、全文本搜索
文章目录 第17章 组合查询 1. 创建组合查询 2. UNION规则 3. 包含或取消重复的行 4. 对组合查询结果排序 第18章 全文本搜索 1. 理解全文本搜索 2. 使用全文本搜索 2.1 启 ...
最新文章
- android通知栏打开actvity,Android实现点击通知栏后,先启动应用再打开目标Activity...
- 汽车票销售系统mysql,jsp683客运汽车票网上售票系统mysql
- javascript打印
- JavaScript基础---语言基础(1)
- 浅析掌握 Python数据分析与展示的几个要点
- 第5章 初识JQuery
- FFmpeg options
- Android插件丢失怎么办,Android studio推荐插件以及升级后插件丢失问题解决
- close on exec标志位
- Ubuntu下apt-get命令详解(转)
- 专题之七:ckk拉链厂信息化实施记
- python绘制子图去掉x轴坐标值_python – 关闭图形的所有子图的轴
- nodejs+socket.io用nginx反向代理提示400 Bad Request及ws://…无法连接的解决方法
- 易语言 word类excel类 的 源码和模块
- 做一个有批判性思维的程序员!
- 别再白瞎去花钱购买高精度卫星地图,一文教你解决精度与下载问题
- c++编写函数判断整数的位数
- 歌评-《Rex Incognito 尘世闲游》-陈致逸
- 照片加水印怎么弄?方法详细介绍
- MATLAB浮点数详解