对于一些简单的检索可以通过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=InnoDBDEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ciCOMMENT='con_视频类文件描述信息'AUTO_INCREMENT=7ROW_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等。
转载于:https://www.cnblogs.com/robertsun/p/5999588.html
