`
zqh1986
  • 浏览: 10791 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql全文检索

阅读更多
mysql到版本3.23.23时,开始支持全文检索,通过语句SELECT ... FROM ... MATCH(...) AGAINST(...) 来在整个表中检索是否有匹配的,全文索引是一个定义为fulltext的类型索引,应用在myisam表中。值得一提的是对于一个大的数据库来说,把数据装载到一个没有fulltext索引的表中,然后再添加索引,这样速度会非常快,但是把数据装载到一个已经有fulltext索引的表中,这样速度非常慢的。



首页要先明白mysql的全文检索原理:mysql使用的是一个非常简单的剖析器来将文本分隔成词,空格、标点等,比如‘welcom to you’将分隔为三个词‘welcom’、‘to’、‘you’,但是对中文来说,比如‘人力方网站正式上线’,这将无法分隔,因此目前mysql只支持英文的全文检索。



下面我们通过实例来一步步把全文检索的过程解释清楚:

首页我们建立表与初始化数据

Sql代码 
1.CREATE TABLE IF NOT EXISTS `category` (      
2.  `id` int(10) NOT NULL auto_increment,      
3.  `fid` int(10) NOT NULL,      
4.  `catname` char(255) NOT NULL,      
5.  `addtime` char(10) NOT NULL,      
6.  PRIMARY KEY  (`id`),      
7.  FULLTEXT KEY `catname` (`catname`)      
8.) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;      
9.     
10.     
11.INSERT INTO `category` (`id`, `fid`, `catname`, `addtime`) VALUES     
12.(1, 0, 'welcome to you!', '1263363380'),      
13.(2, 0, 'hello phpjs,you are welcome', '1263363416'),      
14.(3, 0, 'this is the fan site of you', '1263363673');     
15.  
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、

SQL代码
1.SELECT * FROM `category` WHERE MATCH(catname) AGAINST('phpjs')  


返回结果:

id  fid  catname                                addtime 
2   0    hello phpjs,you are welcome 1263363416

匹配出了含有phpjs关键字的行数据。



2、

SQL代码
1.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’就可以返回所有结果了

SQL代码
1.SELECT * FROM `category` WHERE MATCH (catname) AGAINST ('you')   

返回结果还是为空,大跌眼镜了吧,这又是为什么呢?

原来mysql在集和查询中的对每个合适的词都会先计算它们的权重,一个出现在多个文档中的词将有较低的权重(可能甚至有一个零权重),因为在这个特定的集中,它有较低的语义值。否则,如果词是较少的,它将得到一个较高的权重,mysql默认的阀值是50%,上面‘you’在每个文档都出现,因此是100%,只有低于50%的才会出现在结果集中。



4、有人会想,我不去管权重大小,只要有匹配的就给我返回结果集中,那么该如何做呢?

mysql到 4.0.1 时,可以使用 IN BOOLEAN MODE 修饰语来执行一个逻辑全文搜索

SQL代码
1.SELECT * FROM `category` WHERE MATCH(catname) AGAINST('you' IN BOOLEAN MODE)  




总结:1、要注意最小字符的长度;

           2、要注意关键词的权重;



ps,一些学习资料:

http://www.111cn.net/database/110/FULLTEXT-mysql.htm



http://onlamp.com/pub/a/onlamp/2003/06/26/fulltext.html



http://dev.mysql.com/doc/refman/5.1/zh/functions.html#fulltext-query-expansion
分享到:
评论

相关推荐

    MYSQL高性能全文检索介绍-E文版

    全文检索是MySQL中的一个重要功能,它允许用户通过关键字搜索数据库中的文本内容,而不是仅仅依赖于精确匹配的列值。本篇文章将深入探讨MySQL的全文检索机制,以期帮助你构建高效的全文搜索引擎。 全文检索在信息...

    如何在MySQL中提高全文搜索效率

    在MySQL中提高全文搜索效率是优化数据库性能的关键步骤,尤其是对于那些处理大量文本数据的应用程序。MySQL内置的全文搜索引擎提供了一种高效且智能的方法来执行全文搜索,这比传统的LIKE语句方法更具优势。 首先,...

    Mysql全文搜索match against的用法

    MySQL全文搜索功能主要依赖于`MATCH()`和`AGAINST()`两个函数,用于在MyISAM表类型的字段上执行高效的文本搜索。以下是对标题和描述中所述知识点的详细说明: 1. **全文搜索的前提条件** - 表的存储引擎必须是...

    mysql实现全文检索

    MySQL全文检索是一种高效的数据搜索机制,它允许用户执行类似搜索引擎的查询,显著提高了在大量文本数据中寻找特定信息的速度。全文检索在MySQL中主要应用于MyISAM存储引擎,因为MyISAM支持对大表的数据快速读取,...

    MySQL全文搜索[文].pdf

    MySQL全文搜索是数据库管理系统MySQL中的一种高级特性,用于在大量文本数据中进行高效的数据检索。在MySQL 3.23.23版本之后,引入了全文索引(FULLTEXT),这是专门为MyISAM存储引擎设计的,以支持全文搜索功能。...

    mysql 全文搜索 技巧

    ### MySQL全文搜索技巧详解 #### 一、全文搜索概述 MySQL自版本3.23.23起开始支持全文索引和搜索功能。这一特性极大地增强了数据库查询的能力,特别是对于那些需要处理大量文本数据的应用场景而言。全文索引在...

    mysql 全文模糊查找 便捷解决方案

    MySQL作为广泛使用的开源关系型数据库,提供了多种方式进行全文搜索和模糊匹配。本篇将聚焦于MySQL的全文模糊查找及其便捷解决方案,并结合PHP的Unicode工具类进行讨论。 MySQL的全文索引和搜索功能允许我们快速...

    mysql 全文检索中文解决方法及实例代码

    4. 在进行搜索时,同样使用分词系统对搜索内容进行分词处理,然后利用MySQL的全文检索功能查询。 在上述实例代码中,创建了`ces_articles`数据表,并为`url`字段创建了全文索引。接着插入了几条包含中文和英文的...

    MySQL数据库进行中文全文检索的模拟实现方法.pdf

    在MySQL中,全文索引类型是FULLTEXT的索引,支持全文检索和搜索功能。但是,MySQL对中文字符集的支持较差,在设置数据库字符集为“gb2312”后,全文检索功能失效。 在原始方法中,MySQL数据库要支持全文检索,表...

    对设置 的关键字的全文检索,并且高亮显示

    在IT行业中,全文检索和高亮显示是两个重要的技术概念,尤其在信息检索、搜索引擎以及数据分析等领域广泛应用。这里我们将深入探讨这两个主题。 首先,我们来理解什么是全文检索。全文检索是一种从文档集合中查找...

    用Sphinx搭建MySQL中文全文搜索

    这时,我们可以借助第三方工具如Sphinx来增强MySQL的全文检索能力,实现高效且精准的中文搜索。本文将详细介绍如何使用Sphinx搭建MySQL的中文全文搜索。 首先,Sphinx是一个开源的全文搜索引擎,它的设计目标是提供...

    Solr3.6用DIH组件进行MySQL数据库全文索引部署包

    Solr3.6用DIH组件进行MySQL数据库全文索引部署包 完整的工程部署包 apache-solr-3.6.0.xml 放入apache-tomcat-7.0.27\conf\Catalina\localhost

    mysql全文搜索 sql命令的写法

    MySQL全文搜索是一种强大的功能,允许用户在数据库中执行自然语言搜索。在SQL中,全文搜索主要通过`MATCH()`和`AGAINST()`这两个关键词来实现。`MATCH()`函数用于指定要进行全文搜索的列,而`AGAINST()`则接收搜索...

    一种MySQL数据库全文检索的实现方法.pdf

    传统的全文检索方法是通过 SELECT 查询语句实现的,这种方法存在搜索不够精确以及效率非常低下的缺点。为了解决这个问题,MySQL 提供了一个全文索引功能,可以快速地进行全文检索。 然而,MySQL 的全文索引功能不...

Global site tag (gtag.js) - Google Analytics