本文目的

最近有个项目需要对数据进行搜索功能。采用的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轮播图

    //用原生js实现了一个简单的轮播图效果 <!DOCTYPE html><html> <head> <meta charset="UTF-8&quo ...

  2. Reflux中文教程——概览

    翻译自github上的reflux项目,链接:https://github.com/reflux/refluxjs 〇.安装及引入 安装: npm install reflux 引入: var Ref ...

  3. activiti 一个流程的运转步骤 以请假流程为例

    ---为了加深对activiti的理解记忆,对自己做的一个流程进行自述.加强记忆 请假实例 一.设计请假的流程图以及流程文件,完善对应数据项,比如用户信息,请假单信息 --请假单 --流程图 --流程 ...

  4. DataReader和DataSet区别

    可以使用DataReader类的对象或DataSet类的对象从数据库读取数据,但它们是有区别的,归纳起来大致有以下几条: 1.       DataReader是数据管理提供者类,而DataSet是一 ...

  5. NOIP2009T3最优贸易

    洛谷传送门 看到这个题,原本想先从后往前dfs,求出能到终点的点,再在这些点里从前往后spfa,用一条边上的两个城市的商品价格的差来作边权,实施过后,发现图中既有负边权,又有回路,以及各种奇奇怪怪的东 ...

  6. struts2之拦截器

    1. 为什么需要拦截器 早期MVC框架将一些通用操作写死在核心控制器中,致使框架灵活性不足.可扩展性降低, Struts 2将核心功能放到多个拦截器中实现,拦截器可自由选择和组合,增强了灵活性,有利于 ...

  7. QT5 && VS2013配置

    1.下载安装包 qt-opensource-windows-x86-msvc2013_64-5.7.0.exe VS2013_RTM_ULT_ENU.iso 插件:qt-vs-addin-msvc20 ...

  8. Unity使用GL画线

    脚本需挂在相机上,如果你的脚本,编辑器报错了,Matrix stack full depth reached,加上这个方法试试GL.LoadPixelMatrix(); using System.Co ...

  9. 用extjs6.0写一个点击新建窗口的功能

    一.写一个按钮 注意id { id: 'ListEdit', text:'编辑', iconCls:'x-fa fa-edit' } 二.写新建的页面 下面我新建的是表单,有几点需要注意的: ① 因为 ...

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

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