我在音乐库应用程序中使用的 MySQL 数据库中有三个表:
该Genre表有列:
idtitle(细绳)
该Album表有列:
idgenre_id(外键 到Genre.id)title(细绳)artist(细绳)
该Track表有列:
idalbum_id(外键 到Album.id)title(细绳)
每个Album可以有任意数量Tracks,每个Track有一个Album,每个Album有一个Genre。
我想实现一个关键字搜索,允许用户输入任意数量的关键字并找到所有Tracks这些:
- 有一个匹配
title, - 在
Album一个匹配的title或artist, - 或在一个
Album与Genre一个匹配的title。
结果应按相关性排序。如果每个领域都有相关性排名,那就太好了。例如,titlea 的Track可能比 的 更title重要Genre。
此外,解决方案应该使用某种形式的部分搜索。搜索rubber应该首先Tracks与 a titleof匹配所有Rubber,然后Tracks与title匹配的*rubber*( *=wildcard) 匹配,然后移动到Albums,依此类推。但是,我对这些细节并不那么执着。我只是在寻找一个更通用的解决方案,我可以对其进行调整以满足我的特定需求。
我还应该提到我正在使用 LAMP 堆栈、Linux、Apache、MySQL 和 PHP。
实现此关键字搜索的最佳方法是什么?
更新:我一直在尝试通过全文搜索来实现这一点,并提出了以下 SQL 语句。
CREATE TABLE `Genre` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` text NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY (`title`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
INSERT INTO `Genre` VALUES(1, 'Rock');
CREATE TABLE `Album` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`genre_id` int(11) NOT NULL,
`title` text NOT NULL,
`artist` text,
PRIMARY KEY (`id`),
FULLTEXT KEY (`title`, `artist`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
INSERT INTO `Album` VALUES(1, 1, 'Rubber Soul', 'The Beatles');
CREATE TABLE `Track` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`album_id` int(11) NOT NULL,
`title` text NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY (`title`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
INSERT INTO `Track` VALUES(1, 1, 'Drive My Car');
INSERT INTO `Track` VALUES(2, 1, 'What Goes On');
INSERT INTO `Track` VALUES(3, 1, 'Run For Your Life');
INSERT INTO `Track` VALUES(4, 1, 'Girl');