zoukankan      html  css  js  c++  java
  • MySQL全文检索初探

    本文目的

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

    相关资料

  • 相关阅读:
    MVC路由配置例
    js制作烟花效果
    限制帐号同时两处以上登录-ASP.NET
    地图按范围查找-经纬度计算
    多种JSON格式及遍历方式
    .net错误日志记录(log4)
    .net WebServer示例及调用(接口WSDL动态调用 JAVA)
    关于大型网站技术演进的思考
    优化网站加载速度的14个技巧
    大型网站架构改进历程
  • 原文地址:https://www.cnblogs.com/bourneli/p/2630753.html
Copyright © 2011-2022 走看看