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全文检索原理与实例分析相关推荐

  1. Python实现主成分分析(PCA)降维:原理及实例分析

    转载文章:Python实现主成分分析(PCA)降维:原理及实例分析 简介 降维是由一些问题带来的: 可以缓解由维度诅咒(高维)带来的问题: 可以用来压缩数据,将损失数据最小化: 可以将高维数据降到低维 ...

  2. python pymysql实例_Python使用pymysql模块操作mysql增删改查实例分析

    Python使用pymysql模块操作mysql增删改查实例分析 发布时间:2020-09-30 16:42:12 来源:脚本之家 阅读:92 本文实例讲述了Python使用pymysql模块操作My ...

  3. 计算机操作系统原理课件,【】计算机操作系统原理与实例分析PPT课件(完整版 全)精品.ppt...

    []计算机操作系统原理与实例分析PPT课件(完整版 全)精品 4.2 计算机I/O子系统的组成 4.2.1 I/O系统的结构 (1) 总线型I/O系统的结构 总线型I/O系统结构 (2) 通道型I/O ...

  4. 图像scale与相机参数_Camera图像处理原理及实例分析

    Camera图像处理原理及实例分析 做为拍照手机的核心模块之一,camera sensor 效果的调整,涉及到众多的参数,如果对 基本的光学原理及 sensor 软/硬件对图像处理的原理能有深入的理解 ...

  5. Android Touch事件原理加实例分析

    Android中有各种各样的事件,以响应用户的操作.这些事件可以分为按键事件和触屏事件.而Touch事件是触屏事件的基础事件,在进行Android开发时经常会用到,所以非常有必要深入理解它的原理机制. ...

  6. JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用

    http://www.ibm.com/developerworks/cn/linux/l-cn-jpeg/index.html 一.系统架构 本文以一个实际的产品为例,来说明 JPEG 在其中的应用. ...

  7. XGBoost原理与实例分析

    这几天一直在研究XGboost的基本原理与代码调参,其原理是在GBDT的基础上进行优化,但也有很多的不同之处:所以自己准备更新两篇博客分为XGBoost原理与实例和XGBoost实战与调参优化来巩固这 ...

  8. linux设备驱动模型之 kset原理与实例分析

    1. Kset kset是具有相同类型的kobject的集合,在sysfs中体现成一个目录,在内核中用kset数据结构表示,定义为: struct kset { struct list_head li ...

  9. js reduce实现中间件_Laravel中间件实现原理及实例分析

    Laravel中间件实现原理详解 本文实例讲述了Laravel的中间件实现原理.分享给大家供大家参考,具体如下: #1 什么是中间件? 对于一个Web应用来说,在一个请求真正处理前,我们可能会对请求做 ...

最新文章

  1. Bash Shell脚本编程-变量知识
  2. 《数学之美》第5章 隐含马尔可夫模型
  3. vs社区版到期离线激活_vs2019离线安装包
  4. hadoop三个配置文件的参数含义说明
  5. 开源配置管理平台-Apollo
  6. 《物联网框架ServerSuperIO教程》- 23.动态数据接口增加缓存,提高数据输出到OPCServer和(实时)数据库的效率...
  7. mysql 字段a减字段b_SQL 数据库 如何实现第一行字段A减字段B得到值C,然后再用C减去第二行字段B,以此类推,求高手解答...
  8. MySQL命令:增删与改
  9. WebService学习总结(5)——WebService常见开发框架比较
  10. 炒股十余年,亏了很多钱,现在很迷茫是退出股市还是继续坚持?
  11. 来学习一下概率论基本知识,它能让防止你的模型过拟合
  12. matlab的小波分析,Matlab下小波分析wavelet常用命令
  13. 如何在Vue项目中使用vw实现移动端适配
  14. MATLAB2020安装教程
  15. OpenGL编程指南(第七版)
  16. 关于PHP微信h5棋牌程序开发数据库的备份
  17. mouseover和mouseenter区别
  18. 《自己动手写CPU》学习记录(1)——第1章
  19. Helm模版开发文档
  20. 用苹果手机计算机程序二,两台iPhone怎么互传软件 苹果手机互传应用的3个小技巧...

热门文章

  1. python旋转坐标系_python实现一个点绕另一个点旋转后的坐标
  2. AOSP6.0.1 launcher3入门篇-解析DeviceProject.java及相关文件
  3. mave工程中的一个类调用另一个聚合工程的一个类_求求你,别再写上千行的类了好吗...
  4. Win10+VSCode搭建opencv+C++环境(1)
  5. OpenCV中基本数据结构(3)_Size
  6. Transfomer入门:Self-attention + Multi-head Self-attention
  7. python处理带有‘\x‘的字符串,拆分,解码,重组
  8. [Unity] TortoiseSVN 的 CheckOut 未响应的解决记录
  9. [流体输配管网] 使用 Matlab 绘制莫迪图
  10. PC端动态视频背景引导页(非自适应)