登陆注册
19122000000027

第27章 MySQL的全文搜索(1)

本章要点

本章介绍基于MySQL数据库的全文搜索技术。需要注意的地方是,MySQL 并不支持中文的全文搜索,笔者将在使其支持中文搜索方面提出一些建议。

6.1MySQL 简介

MySQL是最受欢迎的开源SQL数据库管理系统,它由MySQLAB开发、发布和支持。

MySQL是MySQLAB的注册商标。

MySQL是一个快速的、多线程、多用户和健壮的SQL数据库服务器。MySQL 服务器支持关键任务、重负载生产系统的使用,也可以将它嵌入到一个大配置(Mass-deployed)的软件中去。

MySQL是开源的,任何人都可以使用和修改该软件,任何人都可以从Internet上下载和使用MySQL 而不需要支付任何费用。如果愿意,用户可以研究其源代码,并根据需要进行修改。MySQL 使用GPL(GNU General Public License,通用公共许可),在http://www.fsf.org/licenses 中定义了用户在不同的场合对软件可以或不可以做什么。如果想把 MySQL的源代码集成到一个商业应用中去,可以向 MySQLAB 购买一个商业许可版本。

MySQL 服务器包含了一个由用户紧密合作开发的实用特性集。用户可以在MySQLAB的网站 http://www.mysql.com/it-resources/benchmarks/上找到MySQL 服务器和其他数据库管理系统的性能比较。MySQL 服务器原本就是开发比已存在的数据库更快的用于处理大的数据库的解决方案,并且已经成功用于高苛刻生产环境多年。尽管 MySQL 仍在开发中,但它已经提供一个丰富和极其有用的功能集。MySQL的连接性、速度和安全性使它非常适合访问 Internet上的数据库。

MySQL数据库服务器是一个客户-服务器系统,它由多线程SQL 服务器组成,支持不同的后端、多个不同的客户程序和库、管理工具和广泛的应用程序接口APIs。

MySQL也可以是一个嵌入的多线程库,可以把它连接到应用中而得到一个小、快且易于管理的产品。

在Linux 平台底下,MySQL是LAMP 组合的重要组成部分。LAMP 代表了Linux 平台上的Apache网站服务器、MySQL数据库及 Perl,Python 或者 PHP 编程语言的结合。

MySQL 提供的基于C的API可以结合 Glade/GTK+,可以代替Windows平台的VB+Access/MsSQL Server 组合。

MySQL是一种高性能的数据库,能够同时处理无限数量的用户和5亿个记录。MySQL的核心是一个小而快速的数据库,面向那些了解数据库工作的人员,使他们能够有效地工作和编写高级功能。因为MySQL是开放源代码的自由软件,可以运行于所有的平台,如果不能运行,可以修改和编译源代码。

MySQL网站(http://www.mysql.com)提供了关于MySQL和MySQLAB的最新的消息。

6.2MySQL全文搜索

MySQL 支持全文索引和搜索功能。全文索引在MySQL 中是一个FULLTEXT类型索引。FULLTEXT 索引仅可用于MyISAM 表;它们可以从CHAR、VARCHAR 或 TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATEINDEX被添加。对于较大的数据集,将资料输入一个没有FULLTEXT 索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT 索引的速度更快。

6.2.1全文搜索的最简例子MySQL的全文搜索实现起来很简单,在MySQL 手册中讲解这方面的知识也不多。这里不妨先来看一个例子。

首先,建立一个测试数据库。这个数据库就是前面曾经建立的tianen数据库,它含有一个表格 test。

现在,在这个数据库下面建立一个表。使用的SQL语句如下所示:

CREATE TABLE EN

id INTAUTO INCREMENT NOT NULL PRIMARY KEY,

title VARCHAR(200),

body TEXT,

FULLTEXT(title,body)

)type=MyISAM;

在MySQL 命令行界面中输入以上的语句,就建立了一个表格。而且,这个表的title和body被全文索引了。

然后,向表格中添加一些记录,如以下的SQL语句所示。

INSERT INTO EN(title,body)VALUES("love story","this is a new love story-genius and princess");

INSERT INTO EN(title,body)VALUES("my name","my name is genius,as is known to all");

INSERT INTO EN(title,body)VALUES("my hobby","they all like me,they all love me,oh god!");

现在,可以测试常规的搜索,语句如下:

select*from en where body like"%love%";

执行全文搜索,语句如下:

select * from en where match(title,body)against("princess");

这条语句在启动全文索引的列上搜索“princess”,这就是MySQL全文搜索的用法。match后面的括号里是全文索引列的列表,against后面的括号里是被搜索的词汇。要注意:MATCH()函数中的列和被搜索表的FULLTEXT索引中的列相同。若要分别搜索title和body,应该对每个列分别创建FULLTEXT索引。在默认状态下,搜索的执行方式为不区分大小写方式。

但可以通过对编入索引的列使用二进制排序方式执行区分大小写的全文搜索。

这个结果肯定在意料之中。这样就应懂得如何使用MySQL的全文搜索了。不过还差一点。执行以下语句:

select*from en where match(title,body)against("genius");

这个结果有点出乎意料吧!为什么搜索“genius”得到的结果是“空”呢?这就需要了解MySQL的搜索算法了。

6.2.2被忽略的词

在MySQL的全文搜索中,以下一些词会被忽略。

任何过于短的词都会被忽略。全文搜索所能找到的词的默认最小长度为4个字符。

忽略词中的词会被忽略。忽略词就是一个像“the”或“some”这样过于平常而被认为是不具语义的词。存在一些内置的忽略词,但它可以通过用户自定义列表被改写。MySQL的忽略词列表在MySQL参考手册中可以查到,里面没有中文。因为MySQL没有为中文的全文搜索提供支持。

genius并不是MySQL的忽略词,那么为什么它被忽略了呢?

MATCH()函数对于一个字符串执行资料库内的自然语言搜索。一个资料库就是1套1个或2个包含在FULLTEXT内的列。搜索字符串作为对AGAINST()的参数而被给定。对于表中的每一行,MATCH()返回一个相关值,即,搜索字符串和MATCH()表中指定列中该行文字之间的一个相似性度量。

词库和查询中每一个正确的单词根据其在词库和查询中的重要性而被衡量。通过这种方式,一个出现在许多文件中的单词具有较低的重要性(而且甚至很多单词的重要性为零),原因是在这个特别词库中其语义价值较低。反之,假如这个单词比较少见,那么它会得到一个较高的重要性。然后单词的重要性被组合,从而用来计算该行的相关性。

一个符合表中所有行的内容的一半的单词查找相关文档的可能性较小。事实上它更容易找到很多不相关的内容。我们都知道,在因特网上试图使用搜索引擎寻找资料时,这种情况发生的频率颇高。可以推论,包含该单词的行因其所在特别数据集而被赋予较低的语义价值。

一个给定的词有可能在一个数据集中拥有超过其50%的域值,而在另一个数据集却不然。

这项技术最适合同大型词库一起使用(事实上,此时它经过仔细的调整)。对于很小的表,单词分布并不能充分反映它们的语义价值,而这个模式有时可能会产生奇特的结果。例如,虽然单词“genius”出现在文章表中的每一行,但对这个词的搜索得不到任何结果:MATCH()函数使用返回行的相关性从大到小来排列结果。

使用select id,match(title,body)against("genius")from en可以获得“genius”在每一行中的相关度,可以看到相关度都是0,所以搜索不到结果。

使用select id,match(title,body)against("princess")from en可以获得“princess”在每一行中的相关度。

6.2.3布尔模式搜索

1.MySQL执行布尔全文搜索的方式

如果非要搜索出“genius”不可,有没有办法呢?有,布尔模式就是一个常用方法。

利用INBOOLEAN MODE修改程序,MySQL就可以执行布尔全文搜索。

执行以下语句:

select*from en where match(title,body)against("genius"in boolean mode);

如果要搜索出含有“genius”却不含有“princess”的记录,该如何去做呢?

执行以下语句:

select*from en where match(title,body)against("+genius-princess"in boolean mode);

2.布尔全文搜索的特点

布尔全文搜索具有以下特点。

不使用50%阈值。

不会按照相关性渐弱的顺序将行进行分类。

即使没有FULLTEXT,仍然可以工作,尽管这种方式的搜索执行的速度非常之慢。

最小单词长度全文参数和最大单词长度全文参数均适用。

忽略词适用。

3.布尔全文搜索的操作符

若索引中不存在该短语包含的单词,则结果为空。例如,若所有单词都是禁用词,或是长度都小于编入索引单词的最小长度,则结果为空。

以下例子展示了一些使用布尔全文符号的搜索字符串:

"apple banana"

寻找包含至少两个单词中的一个的行。

"+apple+juice"

寻找两个单词都包含的行。

"+apple macintosh"

寻找包含单词“apple”的行,若这些行也包含单词“macintosh”,则列为更高等级。

"+apple-macintosh"

寻找包含单词“apple”但不包含单词“macintosh”的行。

"+apple+(>turnover<strudel)′

寻找包含单词“apple”和“turnover”的行,或包含“apple”和“strudel”的行(无先后顺序),然而包含“apple turnover”的行较包含“apple strudel”的行排列等级更为高。

"apple*′

寻找包含“apple”,“apples”,“applesauce”或“applet”的行。

′"some words"′

寻找包含原短语“some words”的行(例如,包含“some words of wisdom”的行,而非包含“some noise words”的行)。注意包围词组的“"”符号是界定短语的操作符字符。它们不是包围搜索字符串本身的引号。

6.2.4全文搜索带查询扩展

全文搜索支持查询扩展功能(特别是其多变的“盲查询扩展功能”)。若搜索短语的长度过短,那么用户则需要依靠全文搜索引擎通常缺乏的内隐知识进行查询。这时,查询扩展功能通常很有用。例如,某位搜索“动物”一词的用户,可能认为“熊猫”、“老虎”均为符合他的要求,应被返回。这即为内隐知识。

在搜索短语后添加WITH QUERY EXPANSION,激活盲查询扩展功能(即通常所说的自动相关性反馈)。它将执行两次搜索,其中第二次搜索的搜索短语是同第一次搜索时找到的少数顶层文件连接的原始搜索短语。这样,假如这些文件中的一个含有单词“动物”及单词“老虎”,则第二次搜索会寻找含有单词“老虎”的文件,即使这些文件不包含单词“动物”。

全文搜索带查询扩展的使用方法如下:

select*from en where match(title,body)against("genius"with query expansion)

要注意:盲查询扩展功能很容易返回非相关文件而增加无用信息,因此只有在查询一个长度很短的短语时才有必要使用这项功能。

同类推荐
  • 新课标英语学习资源库-三万元遗产

    新课标英语学习资源库-三万元遗产

    课标是常新的,经典却是永恒的,走进经典的选择,学习兴趣的提高离你只有一步之遥。本套丛书包括奥林匹斯山众神、白雪公主、百万英镑、包打听、财神与爱神、打火匣、带家具出租的房子、公主与美洲狮、好孩子的故事、荷马墓上的一朵玫瑰、黄缘奇遇、灰姑娘、井边的牧鹅女、警察与赞美诗、两个勇敢的伊洛特人、母亲的故事、牧羊女和扫烟囱的人、女巫的面包、青蛙王子、三万元遗产、沙丘的故事、忒修斯历险记、特洛伊战争、天国花园、小爱达的花、小红帽、幸福的家庭、雪人、一本不说话的书、勇敢的小裁缝。
  • 语文新课标课外必读第五辑——中国古代寓言

    语文新课标课外必读第五辑——中国古代寓言

    本书所收我国古代寓言,按照思想内容,可以概括成三类。第一类是以生动活泼的比喻讲出深刻的哲理;第二类是具有“劝善惩恶”性质的;第三类是具有讽刺性的。本书所收我国古代寓言,按照思想内容,可以概括成三类。第一类是以生动活泼的比喻讲出深刻的哲理;第二类是具有“劝善惩恶”性质的;第三类是具有讽刺性的。
  • 财务管理(应用型本科)

    财务管理(应用型本科)

    为了满足各应用型院校财务管理课程的教学需要,浙江理工大学经济管理学院组织专业教师编写了这本《财务管理》。全书共分十章,各章除正文之外均有导入语、小结,每章后均附有配套思考题和练习题,有些章节后还附有相关阅读材料。本书除可供应用型本科学生作为学习财务管理课程的教材外,还可作为大中专院校、成人高校和函授学校学生学习财务管理课程的教学用书,也适合企业经济管理干部财务管理知识的培训所用。
  • 中学文科课程资源-诗中鸟

    中学文科课程资源-诗中鸟

    诗词是阐述心灵的文学艺术,而诗人、词人则需要掌握成熟的艺术技巧,并按照严格韵律要求,用凝练的语言、绵密的章法、充沛的情感以及丰富的意象来高度集中地表现社会生活和人类精神世界。中国诗起源于先秦,鼎盛于唐代。中国词起源于隋唐,流行于宋代。
  • 语文新课标课外必读第二辑——百家姓

    语文新课标课外必读第二辑——百家姓

    国家教育部颁布了最新《语文课程标准》,统称新课标,对中、小学语文教学指定了阅读书目,对阅读的数量、内容、质量以及速度都提出了明确的要求,这对于提高学生的阅读能力,培养语文素养,陶冶情操,促进学生终身学习和终身可持续发展,对于提高广大人民的文学素养具有极大的意义。
热门推荐
  • 真实的世界之无双龙印

    真实的世界之无双龙印

    一个班的高中生群穿了,提前被召唤到了真实的世界。而来到真实世界的他们,是否能生存下去呢?异界种族林立,王朝并起,人族共有五大职业:战士、法师、骑士、猎人、盗贼。
  • 佳颖宠物店

    佳颖宠物店

    爱小动物的少女段佳颖因为一只小鸟的死感到十分伤心,身为兽医的爸爸为她来了一家宠物店。这是一家与众不同的宠物店,使佳颖兴奋不已。同校男孩张楚阳为了给贫困的家庭减少负担,来到佳颖宠物店打工。可是意外发生了……
  • 无限化身

    无限化身

    因为懒的走路,汽车诞生了;因为懒得爬楼梯,电梯诞生了;因为懒得洗衣服,洗衣机诞生了;因为懒得用拳头打架,各类军事武器诞生了……————————————————陈浩一向很懒,在他获得分身异能后,更是懒得连一个手指头都懒得动了。吃饭?派出分身去端过来!打架?派出分身去搞定!砍个人,抢个银行什么的小事,分身通通都能搞定……只是……泡妞嘛……嘿嘿,这个还是亲力亲为好了……感谢好友感冒小宝为我倾情制作的书皮,感动ing...
  • 清穿之皇的宠妃

    清穿之皇的宠妃

    他是天生的帝王,无情,无心。可他却对破例无数。她是来自二十一世纪的少女有情,有心。冰与火撞在一起冰注定是那个被火融化的那个。迷你小剧场;呜呜,说好那个不尽女色的皇六子呢?说好的冷酷无情的皇六子呢?这只逗比是谁????拓跋恒昱你想干什么你说呢!救命啊~~~~~~喜欢本书的读者们可以加群哦~~~群名为;若只如初见,群号;345245316
  • 农民工与城市居民融合度研究

    农民工与城市居民融合度研究

    本书对农民工与城市居民融合的重大意义、农民工在城市中的工作与职业融合、农民工的收入与消费、农民工的城市社会融入等方面进行了深入调查与分析,发现农民工与城市居民的融合还有较大差距。为此,提出了在城市化进程中推进农民工与城市居民的融合的对策与建议。
  • 养子如虎

    养子如虎

    当我19岁离开这里就没想过再见,一个人的城市总是会充满了清醒与执拗。并不打算结婚生子而是一个人远走高飞,年夏宫出现在了我的生命里。你问我他是谁?他是我儿咂,诶等等儿咂,老爹那里不可以亲啊!
  • 异界之倾城掌门

    异界之倾城掌门

    别看我只是其貌不扬的小姑娘!要知道我的专长可以易容术!虽然在组织里负责的是“偷鸡摸狗”,但也算是学有所用!可是,为嘛偷样东西,都会穿呀……穿也就算了,为嘛还是一个冷僻门派的掌门……的女儿呀!身份崇高?与我无关!实力权利?都是浮云!不行——我要做最强者,我不要被欺压!看我成为异界之倾城掌门,人人听我的!
  • 欢乐星妻天

    欢乐星妻天

    他是她进娱乐圈的领路人,她用行动证明她是块金子。褚茫茫从一个念不起大学的妹子蹉跎到拥有一沓代言和一屋子奖杯的明星不太容易,作为男主的他很荣幸地说:“我家妹子是美人是学霸是女王是萌物是平面模特是演员是……”众人不耐烦地打断他:请问男主,你是什么?男主很肯定地点头:“男神!”
  • 十几岁的外星人

    十几岁的外星人

    因为隔阂、误解,家长把十几岁的孩子叫做“外星人”,其实家长也是孩子眼中的“外星人”。这是一本韩版的家教图书,作者是一位超级有智慧的妈妈,也是一位优秀的青少年心理咨询师,每天会接触很多青春期的“问题少年”和他们的父母。在这本书中,她为我们展示了一段段敲开孩子心门的故事,她像一个外科医生,对十几岁“外星人”的心理进行了全面的解剖,把他们种种令人头疼的行为背后的来龙去脉呈现在家长眼前,带来一次洞悉孩子内心世界的奇妙之旅。
  • 小七历险记

    小七历险记

    在一个遥远的地方,那里只有暖冬和冷冻,一年三百六十五天,有三百零五天都是白雪纷飞,冰天雪地,生活在哪个地方的人们叫那个地方为雪镇。雪镇里的居民,都不太愿意去外面的世界,他们早已溪谷三从阳光温暖黎明开始,就能看到冰天雪地的生活,就仿佛鱼儿需要生活在水里,他们也需要生活在冰雪的世界。但总有一些人向往不一样的生活,于是,他们才拥有更精彩的人生。