0

このアイデアを始めるのに苦労しています。私は SQL データベースと Java/Apache(tomcat) との html インターフェイスを持っています。曲の名前を並べ替え、曲に関するキーワードに一致させる単純なデータベースを作成しようとしていました。例 「叙事詩、映画、女王、歌う」のようなキーワードを入力し、女王ボヘミアン ラプソディのような曲はほとんどの基準を満たしています。これは「映画」の「壮大な」曲であり、「女王」によって演奏されるため、これは値は 3. また、データベースでは、チャンピオンである女王のような歌は、すべてのキーワード (叙事詩、映画、女王、歌) に一致するため、この歌は 4 になります。

私はSQLのカウント関数といくつかのJAVAコードに手を出しましたが、キーワードをシフトしたり、それらをカウントしてどちらの結果が優れているかを確認したりする方法を見つけることができませんでした.

このようなものを作る方法を学ぶにはどこを見ればよいですか?


説明とリンクありがとうございます。何時間にもわたって読み、読み直した後、データベースの構造について理解が深まりました。そして、ほぼ機能的なウェブページを持っています。最後に 1 つ質問があります。クエリにより、song_ID とカウントの結果が得られます。曲名も表示する方法をいくつか考えました。

私が持っていた最初のアイデアは、名前をジャンクションテーブルに追加することでした。

2 つ目は、一時テーブル (ビュー) を作成し、その情報を使用して他のテーブルからデータを検索することでした。

3 つ目は、元の結果を取得し、曲名とカウントのみを表示する Java コードを作成することでした。....

データをより適切に(そしてより効率的に)処理するための SQL 機能に簡単なものが欠けていると思います。

4

2 に答える 2

1

データベースにtagとsong_idの2つの列があるとします。

CREATE TABLE tags(tag STRING KEY, song_id INT);

次に、SQLクエリですべてを実行できます。

SELECT song_id, count(*)
FROM tags
WHERE tag IN ("epic", "movie", "queen", "sing")
GROUP BY song_id
ORDER BY count(*) DESC;

より複雑なテキスト検索が必要な場合、つまりこのソリューションが遅すぎる場合は、ApacheLuceneやSolrを調べる必要あります

于 2012-08-23T23:10:04.380 に答える
0

3つのテーブル:

  • song_id整数である主キーを持つ曲
  • 主キーがtag文字列であるタグ
  • songs-他の2つのテーブルをリンクするジャンクションテーブルであるタグ。との複合主キーがsong_idありますtag

したがって、曲にこれらの行(タプル)がある場合:

  • song_id:1; 名前:ボヘミアンラプソディ
  • song_id:2; 名前:私たちはチャンピオンです

そして私たちが持っていたタグで:

  • タグ:叙事詩
  • タグ:映画
  • タグ:女王
  • タグ:歌う

次に、曲タグで次のようになります。

  • song_id:1; タグ:叙事詩
  • song_id:1; タグ:映画
  • song_id:1; タグ:女王
  • song_id:2; タグ:叙事詩
  • song_id:2; タグ:映画
  • song_id:2; タグ:女王
  • song_id:2; タグ:歌う

ここで、特定のタグに一致する曲を見つけるには、songs-tagsテーブルから関連する行を選択するだけです。

元のデザインの問題は、複数のタグを1行に格納していることです。代わりに、特定の曲に一致するタグごとに個別の行を用意する必要があります。3つのタグが一致する場合は、3つの行が必要になります。

データベースの正規化について少し読んで、元の設計が効果的に機能しない理由を理解することをお勧めします。

(ジョーKの以前の回答では、基本的に同じことを提案し、どのタグがどの曲に一致するかを判断するためのSQLクエリを提供しました。もう少し具体化しただけです)

于 2012-08-24T23:46:10.767 に答える