音楽ライブラリ アプリケーションで使用される MySQL データベースに 3 つのテーブルがあります。
Genre
テーブルには次の列があります。
id
title
(ストリング)
Album
テーブルには次の列があります。
id
genre_id
( への外部キーGenre.id
)title
(ストリング)artist
(ストリング)
Track
テーブルには次の列があります。
id
album_id
( への外部キーAlbum.id
)title
(ストリング)
それぞれAlbum
に任意の数の を含めることができTracks
、それぞれTrack
に を 1 つAlbum
、それぞれに をAlbum
1つ持つことができますGenre
。
ユーザーが任意の数のキーワードを入力してすべてを検索できるようにするキーワード検索を実装したいと考えていますTracks
。
- 一致する
title
、 - に
Album
一致するtitle
またはartist
、 - または に一致する を使用してい
Album
ます。Genre
title
結果は関連性でソートする必要があります。各フィールドに関連性のランキングがあれば素晴らしいことです。たとえば、 のtitle
は のTrack
よりも重要な場合がtitle
ありGenre
ます。
また、ソリューションでは何らかの形式の部分検索を使用する必要があります。の検索は、最初にofrubber
ですべて一致Tracks
し、次に一致( =wildcard) で一致し、次に に移動する必要があります。ただし、私はこれらの詳細についてはそれほど固執していません。特定のニーズに合わせて微調整できる、より一般的なソリューションを探しています。title
Rubber
Tracks
title
*rubber*
*
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');