PHPWPS

 找回密码
 立即加入

QQ登录

只需一步,快速开始

搜索
热搜: php discuz
查看: 7215|回复: 0

[其它] MYSQL 百万条记录全文检索中文解决方案

[复制链接]

280

主题

420

帖子

1970

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1970
发表于 2014-5-27 18:52:30 | 显示全部楼层 |阅读模式
  说起数据库,MYSQL最适合用于小型运用的开发。最近想弄一个简单的音乐网站玩一下,数据库是以前在网上爬去的。数据不是特别多,但是也不少,查了一下一共有六十多万条歌曲的记录。既然是做音乐网站的话,首先要有一个搜索的功能,至少要能够搜索你有的歌曲吧。由于以前没有怎么认真弄过sql查询的问题,所以还是用最简单的方法去查询,但是这次遇到了单表上百万记录。我用select * from song where songname like '%key%';去查询,结果效率低到难以忍受。竟然用了三十多秒才出结果!这对于任何运用都是没办法忍受的。后来就想着去做sql查询的优化,google了很久,试过了建立索引,改变表的结构等等都无济于事啊。后来看到一篇专业文章写道,其实对应大数据量查询的时候,很多数据库是支持全文检索的。知道以后我立马开始弄全文检索:
首先我的表默认是:innoDB,这种表的类型不支持全文检索,所以要先改变其类型为MyISAM。
alter table song engine=MyISAM;
然后要在对应的要进行查找的字段上面建立全文检索的索引:
alter table add fulltext index(songname);
如果要同时对多个字段进行检索可以这样:
alter table add fulltext index(songname,singername);
这样做好以后呢,就可以对表进行全文检索了,速度提升是飞一般的感觉啊!现在的结果是秒出啊。可以这样去检索字段:
select * from song where match(singername) against('周杰伦') ;
或者多字段:
select * from song where match(singername,songname) against('风雨');
但是,其实这个时候中文是没办法得到结果的!应为MYSQL目前只支持英文字符的全文搜索,这又叫我蛋疼了一下。后来看到一个论文说是按照把中文转化为拼音,就可以用英文检索对中文进行检索了。看了一下拼音的思路以后我就有了一个注意,在表里面为每一个需要检索的字段对应添加一个拼音字段,检索的时候直接对拼音检索就可以了。
  首先要解决的问题是在已有的表里面添加拼音字段,我用的是java,将中文转化为拼音不是难事。所以我写了一个小程序,修改了一下表的结构,为每一个需要查询的字段添加了一个对应的拼音字段。
  这样的话在查询的时候先把中文关键字先用小程序转化为拼音然后对拼音字段进行全文检索就能得到结果了。我的中文检索是这样子解决的。也许有其它办法,这个方法解决了我的小问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

本版积分规则

QQ|小黑屋|手机版|Archiver|phpwps Inc. ( 鄂ICP备14011625号-1 )

GMT+8, 2025-5-4 16:14 , Processed in 0.054489 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表