mysql 全文搜索 fulltext 排序问题

新手上路,请多包涵

我想实现的功能是多关键字搜索标题按相似度最高结果排序结果。 目前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内,当然越少越好了 ^_^

感谢!

阅读 4.5k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题