我在音乐库应用程序中使用的 MySQL 数据库中有三个表:
该Genre
表有列:
id
title
(细绳)
该Album
表有列:
id
genre_id
(外键 到Genre.id
)title
(细绳)artist
(细绳)
该Track
表有列:
id
album_id
(外键 到Album.id
)title
(细绳)
每个Album
可以有任意数量Tracks
,每个Track
有一个Album
,每个Album
有一个Genre
。
我想实现一个关键字搜索,允许用户输入任意数量的关键字并找到所有Tracks
这些:
- 有一个匹配
title
, - 在
Album
一个匹配的title
或artist
, - 或在一个
Album
与Genre
一个匹配的title
。
结果应按相关性排序。如果每个领域都有相关性排名,那就太好了。例如,title
a 的Track
可能比 的 更title
重要Genre
。
此外,解决方案应该使用某种形式的部分搜索。搜索rubber
应该首先Tracks
与 a title
of匹配所有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');