mysql到版本3.23.23时,开始支持全文检索,通过语句SELECT ... FROM ... MATCH(...)
AGAINST(...)
来在整个表中检索是否有匹配的,全文索引是一个定义为fulltext的类型索引,应用在myisam表中。值得一提的是对于一个大的数据库来说,把数据
装载到一个没有fulltext索引的表中,然后再添加索引,这样速度会非常快,但是把数据装载到一个已经有fulltext索引的表中,这样速度非常慢
的。
首页要先明白mysql的全文检索原理:mysql使用的是一个非常简单的剖析器来将文本分隔成词,空格、标点等,比如‘welcom to
you’将分隔为三个词‘welcom’、‘to’、‘you’,但是对中文来说,比如‘人力方网站正式上线’,这将无法分隔,因此目前mysql只支持
英文的全文检索。
下面我们通过实例来一步步把全文检索的过程解释清楚:
首页我们建立表与初始化数据
CREATE TABLE IF NOT EXISTS `category` (
`id` int(10) NOT NULL auto_increment,
`fid` int(10) NOT NULL,
`catname` char(255) NOT NULL,
`addtime` char(10) NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `catname` (`catname`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
INSERT INTO `category` (`id`, `fid`, `catname`, `addtime`) VALUES
(1, 0, 'welcome to you!', '1263363380'),
(2, 0, 'hello phpjs,you are welcome', '1263363416'),
(3, 0, 'this is the fan site of you', '1263363673');
在具体实例之前,我们分析下msyql全文检索的语法:函数 MATCH() 对照一个文本集(包含在一个 FULLTEXT
索引中的一个或多个列的列集)执行一个自然语言搜索一个字符串。搜索字符串做为 AGAINST()
的参数被给定。搜索以忽略字母大小写的方式执行。说白了就是MATCH给定匹配的列(fulltext类型索引),AGAINST给定要匹配的字符串,多
个用空格、标点分开,mysql会自动分隔。
1、
SELECT * FROM `category` WHERE MATCH(catname) AGAINST('phpjs')
返回结果:
id fid catname addtime
2 0 hello phpjs,you are welcome 1263363416
匹配出了含有phpjs关键字的行数据。
2、
SELECT * FROM `category` WHERE MATCH (catname) AGAINST ('this')
按照上面的思路,第三行数据含有this,因此应该可以匹配出第三行数据的,但事实却奇怪得很,返回结果为空,为什么呢?
原来是mysql指定了最小字符长度,默认是4,必须要匹配大于4的才会有返回结果,可以用SHOW
VARIABLES
LIKE
'ft_min_word_len'
来查看指定的字符长度,也可以在mysql配置文件my.ini 更改最小字符长度,方法是在my.ini 增加一行
比如:ft_min_word_len = 2,改完后重启mysql即可。
3、这里我们要确定把最小字符改为2了,因为3行记录都有‘you’,因此心想,匹配‘you’就可以返回所有结果了
SELECT * FROM `category` WHERE MATCH (catname) AGAINST ('you')
返回结果还是为空,大跌眼镜了吧,这又是为什么呢?
原来mysql在集和查询中的对每个合适的词都会先计算它们的权重,一个出现在多个文档中的词将有较低的权重(可能甚至有一个零权重),因为在这个
特定的集中,它有较低的语义值。否则,如果词是较少的,它将得到一个较高的权重,mysql默认的阀值是50%,上面‘you’在每个文档都出现,因此是
100%,只有低于50%的才会出现在结果集中。
4、有人会想,我不去管权重大小,只要有匹配的就给我返回结果集中,那么该如何做呢?
mysql到 4.0.1 时,可以使用 IN BOOLEAN MODE 修饰语来执行一个逻辑全文搜索
SELECT * FROM `category` WHERE MATCH(catname) AGAINST('you' IN BOOLEAN MODE)
总结:1、要注意最小字符的长度;
2、要注意关键词的权重;
中文全文检索解决方案
前面我们已经知道了mysql全文检索的原理以及分词技巧,同时也知道mysql全文检索只支持英文,那么中文该如何来检索呢?
其基本思路是把中文转换为英文,这里要用到两个表,一个是原始内容表,一个是原始内容转换为英文后的表(也叫索引表),它的搜索过程是这样的:先对
用户输入的信息进行分词,然后把这些词转换为英文,这样就可以利用mysql的全文检索对检索表进行匹配,得出id再从原始内容表查询。
下面来说下两种mysql中文检索的方案:
分别建一个内容表、一个内容索引表
CREATE TABLE IF NOT EXISTS `news` (
`id` int(8) NOT NULL auto_increment,
`content` varchar(100) default NULL,
PRIMARY KEY (`id`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `news_index` (
`id` int(8) NOT NULL auto_increment,
`nid` int(8) NOT NULL,
`key` text,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
1、将中文转换为base64编码
$data = '我要坚持学php';
$data = base64_encode($data); //返回的结果就是编码后的字符串,这里省略了分词这个步骤
但是这种方式有个缺点,当用户搜索拼音的时候检索不出结果;
2、将中文转换为拼音
网上有很多将中文转换为拼音的源码,看附件,之后参照上面的步骤把中文转换为拼音就行了。
分享到:
相关推荐
本文实例讲述了mysql游标的原理与用法。分享给大家供大家参考,具体如下: 本文内容: 什么是游标 创建游标 使用游标 首发日期:2018-04-18 什么是游标: 如果你前面看过mysql函数,会发现无法使用返回多行...
MySQL中的连续聚合是一种针对...通过对`EmpOrders`表的实例分析,我们理解了如何创建和填充这样的表,以及如何执行各种类型的连续聚合操作。在实际项目中,理解并熟练运用这些概念能够极大地提升数据处理和分析的能力。
索引的本质是帮助提高数据库表中数据检索的效率,其原理是通过对表中一列或多列数据进行排序、构建数据结构(如B树、哈希表)来实现快速定位数据的目的。 索引类型分为普通索引、唯一索引、全文索引、单列索引、多...
通过分析和学习这个源码实例,你可以提升在PHP和MySQL方面的技能,理解动态网站的工作原理,以及如何利用这两种技术构建功能完善的Web应用。同时,这也为你提供了实践和调试代码的机会,加深对Web开发流程的理解。...
在本课程中,“PHP+MYSQL动态网站开发与全程实例课件+源码”将深入讲解如何使用PHP编程语言和MySQL数据库来构建动态网站。这个综合性的学习资源包含了课件和实际的源代码,旨在帮助开发者从理论到实践全方位地掌握这...
5.2.1. 用MySQL实例管理器启动MySQL服务器 5.2.2. 连接到MySQL实例管理器并创建用户账户 5.2.3. MySQL实例管理器命令行选项 5.2.4. MySQL实例管理器配置文件 5.2.5. MySQL实例管理器识别的命令 5.3. mysqld:MySQL...
在“数据库系统原理与应用开发实例”中,我们将会深入探讨这些关键概念。 首先,我们要理解数据库的基本概念。数据库是一个组织和存储数据的系统,它可以支持数据的高效检索、更新和管理。常见的数据库类型包括关系...
5.2.1. 用MySQL实例管理器启动MySQL服务器 5.2.2. 连接到MySQL实例管理器并创建用户账户 5.2.3. MySQL实例管理器命令行选项 5.2.4. MySQL实例管理器配置文件 5.2.5. MySQL实例管理器识别的命令 5.3. mysqld:...
5.2.1. 用MySQL实例管理器启动MySQL服务器 5.2.2. 连接到MySQL实例管理器并创建用户账户 5.2.3. MySQL实例管理器命令行选项 5.2.4. MySQL实例管理器配置文件 5.2.5. MySQL实例管理器识别的命令 5.3. mysqld:MySQL...
源码中的"recipes"目录可能包含了各种MySQL操作的实例代码,这些代码涵盖了从基本的数据库创建、表结构设计,到复杂的查询优化、性能调优等多个方面。以下是基于这个标题和描述可能涉及的一些MySQL知识点: 1. **...
5.2.1. 用MySQL实例管理器启动MySQL服务器 5.2.2. 连接到MySQL实例管理器并创建用户账户 5.2.3. MySQL实例管理器命令行选项 5.2.4. MySQL实例管理器配置文件 5.2.5. MySQL实例管理器识别的命令 5.3. mysqld:...
5.2.1. 用MySQL实例管理器启动MySQL服务器 5.2.2. 连接到MySQL实例管理器并创建用户账户 5.2.3. MySQL实例管理器命令行选项 5.2.4. MySQL实例管理器配置文件 5.2.5. MySQL实例管理器识别的命令 5.3. mysqld:MySQL...
用MySQL实例管理器启动MySQL服务器 5.2.2. 连接到MySQL实例管理器并创建用户账户 5.2.3. MySQL实例管理器命令行选项 5.2.4. MySQL实例管理器配置文件 5.2.5. MySQL实例管理器识别的命令 5.3. mysqld...
5.2.1. 用MySQL实例管理器启动MySQL服务器 5.2.2. 连接到MySQL实例管理器并创建用户账户 5.2.3. MySQL实例管理器命令行选项 5.2.4. MySQL实例管理器配置文件 5.2.5. MySQL实例管理器识别的命令 5.3. mysqld:MySQL...
在这一章,我们将学习MySQL的主从复制,了解复制的工作原理和配置方法,以及如何实现高可用性和故障切换。 第九章:性能监控与调优 这里将教授如何使用各种工具(如SHOW STATUS、SHOW VARIABLES、pt-query-digest等...
MySQL是世界上最受欢迎的关系型数据库管理系统之一,广泛应用于各种规模的企业和项目中,因其高效、稳定和...通过学习这些内容,你将能够更好地优化MySQL实例,搭建高可用的数据中心,从而提升整个系统的稳定性和效率。
5.2.1. 用MySQL实例管理器启动MySQL服务器 5.2.2. 连接到MySQL实例管理器并创建用户账户 5.2.3. MySQL实例管理器命令行选项 5.2.4. MySQL实例管理器配置文件 5.2.5. MySQL实例管理器识别的命令 5.3. mysqld:MySQL...
配合《MySQL数据库原理及应用(微课版)(第3版)》的教案,教师可以按照这些知识点组织课程,结合实例演示和练习,帮助学生从理论到实践全面掌握MySQL的使用。教案可能包含课件、案例分析、习题解答、实验指导等...