zoukankan      html  css  js  c++  java
  • mysql 自带全文检索

    对于一些简单的检索可以通过mysql自带的全文索引及 MATCH AGAINST 查询语句实现。实验步骤如下。
    1、建表
    DROP table IF exists con_video_file_des_test;
    CREATE TABLE `con_video_file_des_test` (
    `content_id`  bigint(20) NOT NULL AUTO_INCREMENT COMMENT '视频ID' ,
    `video_title`  varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '视频标题' ,
    `video_title_phonetic`  text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '视频标题拼音' ,
    `video_title_en`  varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '视频标题英文' ,
    PRIMARY KEY (`content_id`)
    )
    ENGINE=InnoDB
    DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
    COMMENT='con_视频类文件描述信息'
    AUTO_INCREMENT=7
    ROW_FORMAT=COMPACT;
    2、插入测试数据
    INSERT INTO `test`.`con_video_file_des_test` (`content_id`, `video_title`, `video_title_phonetic`, `video_title_en`) VALUES ('1', '建国大业', 'jian guo da ye', 'blockbuster Founding of the Republic');
    INSERT INTO `test`.`con_video_file_des_test` (`content_id`, `video_title`, `video_title_phonetic`, `video_title_en`) VALUES ('2', '坚果游记', 'jian guo you ji', 'jian guo travel');
    3、索引如下
    alter table con_video_file_des_test add fulltext search_index(video_title,video_title_phonetic,video_title_en);
    4、查询测试
    a: select * from con_video_file_des_test where match(video_title,video_title_phonetic,video_title_en) against('建国');
    b: select * from con_video_file_des_test where match(video_title,video_title_phonetic,video_title_en) against('建国大业');
    c: select * from con_video_file_des_test where match(video_title,video_title_phonetic,video_title_en) against('jian guo');
    d: select * from con_video_file_des_test where match(video_title,video_title_phonetic,video_title_en) against('jian guo da ye');
    a查询无数据;b查询返回第一条记录,c,d查询都返回两条记录,并第一条记录为坚果游记。
    解释如下因为mysql是以空格分割进行分词建立索引的,所以a查询没有查到数据,b查询能查到数据;c,d查询均查询到语句第一条记录为坚果游记是因为MATCH...AGAINST是以相关性排序,由高到低;
    其他注意事项:
    1、预设搜寻是不分大小写,若要分大小写,columne 的 character set要从utf8改成utf8_bin。
    2、预设 MATCH...AGAINST 是以相关性排序,由高到低。
    3、MATCH(title, content)里的字段必须和FULLTEXT(title, content)里的字段一模一样。否则提示 Can't find FULLTEXT index matching the column list。
    4、ft_min_word_len = 全文检索的最小许可字符(默认4,通过 SHOW VARIABLES LIKE 'ft_min_word_len' 可查看),中文通常是两个字就是一个词。
    5、检索方式有自然语言检索(IN NATURAL LANGUAGE MODE)和布尔检索(IN BOOLEAN MODE)两种,两种检索就不深入研究了。
    6、由于不能对中文进行单个字词的检索,一解决方法是添加拼音列,存储中文转成的拼音,将输入的中文转为拼音进行检索并返回结果,但这样会出现输入“建国”找到了两条记录“建国大业”、“坚果游记”。
    mysql的全文检索可以应对一些简单的应用需求,对于一些要求更高的应用可以通过其他全文检索方式实现,比如Lucene、Nutch、solr等。

  • 相关阅读:
    【BZOJ2287】消失之物
    【NOI2001】炮兵阵地
    【SCOI2005】互不侵犯
    【USACO2007 nov glod】玉米田
    【NOIP模拟】航班
    【NOIP模拟】闲荡
    【NOIP模拟】军队调遣
    树形地铁系统
    矩阵
    完美的集合(题解)
  • 原文地址:https://www.cnblogs.com/robertsun/p/5999588.html
Copyright © 2011-2022 走看看