我想实现的功能是多关键字搜索标题按相似度最高结果排序结果。 目前50w的数据量(测试时用了16w+),服务器比较弱(VPS),所以排除了like。 想到了fulltext,查了下资料,折腾了一下午,查询貌似没有问题,排序问题来了,具体如下:
专门建了一个数据表,结构:
CREATE TABLE IF NOT EXISTS `searchfulltext` (
`sid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`id` int(10) unsigned NOT NULL DEFAULT '0',
`title` varchar(180) NOT NULL,
PRIMARY KEY (`sid`),
KEY `id` (`id`),
FULLTEXT KEY `title` (`title`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=168432 ;
id存放的是article的信息id title存放的是文章标题二元分词后urlencode并且去%后的结果: E4BA8CE7BAA7 E7BAA7E5BBBA E5BBBAE980A0 E980A0E5B888 E5B7A5E7A88B E7A88BE6B395 E6B395E8A784 E7B2BEE8AEB2 E8AEB2E78FAD mp3 E8AFBEE4BBB6 E4BBB6E7ACAC 18 E7ACACE4B880 E4B880E7ABA0 E7AB
导入16w+数据后,.MYD 23.9MB,.MYI 25.8MB
注:以下测试结果数据是在本地环境,AMD 1055T,8G,120G SSD。
直接查询:
SELECT id
FROM searchfulltext
WHERE MATCH(title) AGAINST('E5B7A5E7A88B E7A88BE6A682 E6A682E9A284 E9A284E7AE97' IN BOOLEAN MODE) and MATCH(title) AGAINST('E585ACE8B7AF' IN BOOLEAN MODE)
LIMIT 0, 20
时间:0.018s
加排序排序查询:
SELECT id, (MATCH(title) AGAINST('E5B7A5E7A88B E7A88BE6A682 E6A682E9A284 E9A284E7AE97' IN BOOLEAN MODE) + MATCH(title) AGAINST('E585ACE8B7AF' IN BOOLEAN MODE)) AS score
FROM searchfulltext
WHERE MATCH(title) AGAINST('E5B7A5E7A88B E7A88BE6A682 E6A682E9A284 E9A284E7AE97' IN BOOLEAN MODE) and MATCH(title) AGAINST('E585ACE8B7AF' IN BOOLEAN MODE)
ORDER BY score DESC
LIMIT 0, 20
时间:0.945s
Sorting result 0.9220400 99.785%
显然,加了结果排序后近1秒的执行时间让人恼火!放到vps后估计这个结果会更让人失望。 vps资源少的可怜,sphinx,XunSearch之类的第三方全文搜索,目前几乎可以视为没有条件装。
本人技术小白,求助各位,有啥好方法没有呢? 理想结果能控制在0.5s内,当然越少越好了 ^_^
感谢!