本文目的

最近有个项目需要对数据进行搜索功能。采用的LAMP技术开发,所以自然想到了MySQL的全文检索功能。现在将自己搜集的一些资料小结,作为备忘。

MySQL引擎

据目前查到的资料,只有MyISAM引擎支持全文检索(full text index),查询效率高。但是有局限,不支持事务和外键。

Innodb支持事务和外键,但是不支持全文检索。所以,如果需要全文检索的数据,需要使用MyISAM引擎创建表。

MySQL中文全文检索

很遗憾,目前mysql不支持中文全文检索。目前有两种解决方案

  • 方案1:使用mysql中文检索插件,个人认为可控性较差,虽然使用方便,但是如果后期插件出现问题,比较难解决。优点就是前期工作量相对较小。
  • 方案2:中文分词+GB2312编码:通过分词将原文分隔开,然后转成GB2312的二进制文本形式(如一个字,4个字节A623,这样就可以搜索单个中文)。(转成GB2312编码是为了避免中英文混合搜索。mysql全文检索最小长度默认4(ft_min_word_len)个字,中文是4个汉字,英文是4个字母。对于中文,基本上都是2子词,所以设置ft_min_word_len2,但英文中,2字的单词一般没有什么特殊意义,如‘is’,‘do’等,所以为了兼顾中英文语法习惯,将中文适当‘变长’,也就是转成GB2312的可见形式编码
  • 方案3:中文分词,ft_min_word_len设置为2,调用'repair table your_table quick',修复索引。相比方案2,此方案较节省空间。对于主要使用中文的系统而言,此方案更佳。

创建全文索引

举一个文章表(t_article)的例子,title和body作为列子,如下:

CREATE TABLE `t_article` (
`title` varchar(100) DEFAULT NULL,
`body` text,
FULLTEXT KEY `ft_title` (`title`),
FULLTEXT KEY `ft_body` (`body`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

P.S.: 如果有个表已经创建了全文索引,想要查看创建语法,可以使用“SHOW CREATE TABLE talbe_name;”这条命令显示表格的创建语句。

注意红色高亮部分就是全文检索的语法。删除也很简单,比如删除title的全文索引,“ALTER TABLE t_article DROP INDEX ft_title;”。

使用SQL检索

比如期望对body中的数据进行全文检索,命令如下

SELECT title, MATCH(body) AGAINST('php and other key word') AS score
FROM t_article
WHERE MATCH(body) AGAINST('php and other key word');

注意这里的score很重要,该值代表了关键字与文本的相关性,该值一般在0到1之间,但是也可能达到4或更多。

相关资料

转自:http://www.cnblogs.com/bourneli/archive/2012/08/09/2630753.html

MySQL全文检索初探的更多相关文章

  1. PHP+mysql数据库开发搜索功能:中英文分词+全文检索(MySQL全文检索+中文分词(SCWS))

    PHP+mysql数据库开发类似百度的搜索功能:中英文分词+全文检索 中文分词: a)   robbe PHP中文分词扩展: http://www.boyunjian.com/v/softd/robb ...

  2. RDS MySQL 全文检索相关问题的处理

    RDS MySQL 全文检索相关问题 1. RDS MySQL 对全文检索的支持 2. RDS MySQL 全文检索相关参数 3. RDS MySQL 全文检索中文支持 3.1 MyISAM 引擎表 ...

  3. mysql performance_schema 初探

    mysql  performance_schema 初探: mysql 5.5 版本 新增了一个性能优化的引擎: PERFORMANCE_SCHEMA 这个功能默认是关闭的: 需要设置参数: perf ...

  4. MySQL全文检索笔记 转载

    1. MySQL 4.x版本及以上版本提供了全文检索支持,但是表的存储引擎类型必须为MyISAM,以下是建表SQL,注意其中显式设置了存储引擎类型 CREATE TABLE articles ( id ...

  5. mysql 全文检索的匹配问题

    开发过程中碰到一个关于mysql 全文检索的问题,控制台打印的SQL语句拿到数据库里执行,结果不对.后来发现原来是少了双引号.下面是网上找到的资料,我是看到这个才意识到自己的问题. 这是之前在数据库执 ...

  6. MySQL 日志初探

    目录 MySQL 日志初探 零.概述 一.Error Log(错误日志) 二.General Query Log(通用查询日志) 三.Slow Query Log (慢查询日志) 四.Binary L ...

  7. mysql视图初探

    mysql视图初探 官方例子如下,从官方的例子就可以看出来视图就是提供一种快捷查询.用视图来查询一些常用的结果. mysql> help create view; Name: 'CREATE V ...

  8. MySQL -- 全文检索(查询扩展检索)

    通常用在查询的关键词太短,用户需要隐含知识进行扩展.例如,查单词database时,用户可能还希望不仅仅包含database的文档,可能还指包含mysql.oracle.db2等单词.这时就需要查询扩 ...

  9. MySQL -- 全文检索(布尔全文检索)

    modifier的值为in boolean mode的时候,可以使用布尔全文检索.在布尔全文检索中,有些字符在检索字符串的开头或结尾会有特殊含义.在下面的示例中,+和-操作符表明在匹配的时候,单词必须 ...

随机推荐

  1. js随机模块颜色

    <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...

  2. Myeclipse快捷键以及使用技巧大全-来自网络

    1. 打开MyEclipse 6.0.1,然后"window"→"Preferences" 2. 选择"java",展开,"Edi ...

  3. 封装Echarts

    项目中需要对数据进行图形展示,例如展示柱状图.饼状图等.这类的前端展示脚本很多,常见的是HighCharts和Echarts.HighCharts是基于svg技术的,而echarts基于Echarts ...

  4. huffman编码【代码】

    哈夫曼编码应该算数据结构"树"这一章最重要的一个问题了,当时大一下学期学的时候没弄懂,一年后现在算是明白了. 首先,讲讲思路. 正好这学期在学算法,这里面就用到了贪心算法,刚好练练 ...

  5. iOS项目中常见的文件

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  6. JS前端数据格式化

    当我们从后台取了数据,但是我们希望在前台统一显示格式时,我们可能需要格式化数据. 今天正好总结一下前端JS格式化数据的几个方法: 1. toFixed() 方法   可把 Number 四舍五入为指定 ...

  7. vue.js随笔记---初识Vue.js

    1.基础要求: 1.1 HTML CSS JAVASCRIPT 1.2 模块化基础 1.3 Es6初步了解 2.vue.js 轻量级的MVVM模式框架,他同时吸收了recat和angular的优点,他 ...

  8. 跨语言学习的基本思路及python的基础学习

    笔者是C#出身,大学四年主修C#,工作三年也是C#语言开发.但在学校里其他的语言也有相应的课程,eg:Java,Php,C++都学过,当然只是学了皮毛(大学嘛,你懂得),严格来说未必入门,但这些语言的 ...

  9. CF Manthan, Codefest 16 G. Yash And Trees 线段树+bitset

    题目链接:http://codeforces.com/problemset/problem/633/G 大意是一棵树两种操作,第一种是某一节点子树所有值+v,第二种问子树中节点模m出现了多少种m以内的 ...

  10. 初学Log4Net

    1.Log4Net是什么?       Log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件.数据库.EventLog等)   2.Appender      Appende ...