【问题标题】:Ranking search Results with Keywords in SQL在 SQL 中使用关键字对搜索结果进行排名
【发布时间】:2012-08-19 11:59:40
【问题描述】:

我在开始这个想法时遇到了麻烦。我有一个 SQL 数据库和一个带有 JAVA/Apache(tomcat) 的 html 接口。我试图创建一个简单的数据库,对歌曲名称进行排序并匹配关于歌曲的关键字。 示例我输入了诸如“史诗、电影、女王、歌唱”之类的关键字,而像波西米亚女王狂想曲这样的歌曲符合大多数标准,它是“电影”中的“史诗”歌曲,由“女王”表演,所以这将制作值为 3。 并且在数据库中,我们是冠军之类的歌曲会满足所有关键字(史诗,电影,女王,唱歌)->所以这首歌将是4。

我已经涉足 sql 和一些 JAVA 代码中的计数函数,但我无法找到一种方法来切换关键字,或者计算它们以查看哪个结果更好。

我应该去哪里学习如何制作这样的东西?


非常感谢您的解释和链接。经过数小时的阅读和重新阅读,我对数据库结构有了更多的了解。并有一个近乎功能的网页。我有最后一个问题。查询给了我 song_ID 和计数的结果。我想了一些方法来让歌曲名称也显示出来。

我的第一个想法是将名称添加到联结表。

第二个是创建一个临时表(视图),然后使用该信息从其他表中查找数据。

第三个是编写一个java代码来获取原始结果,然后只显示歌曲名称和数量。 ....

我认为我缺少一些简单的 SQL 能力来更好地(并且更有效地)处理数据。

【问题讨论】:

标签: java sql database-design full-text-search search-engine


【解决方案1】:

假设您的数据库有两列:tag 和 song_id,如下所示:

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;

如果您想要更复杂的文本搜索,即如果这个解决方案最终太慢,您应该查看 Apache Lucene 和/或 Solr

【讨论】:

  • 我认为我没有掌握的困扰概念是如何从不同的 song_id('s) 中搜索多个标签。这是我根据您的建议得出的结论。问题是我没有看到任何方法可以在 SQL 中对字符串使用逗号分隔符或分隔符,或者看到如何在不获取数据并将其放入物理 txt 文件的情况下使其在 java 中运行。必须有一种解决方法,我在 Databases 中不了解。有什么建议吗?
  • 创建表 tags3(tag VARCHAR2(100), song_id INT,PRIMARY KEY(tag)); SELECT song_id, count() FROM tags3 WHERE tag IN ('epic', 'queen', 'pain', 'rat') GROUP BY song_id ORDER BY count() DESC; INSERT INTO tags3 (song_id , tag ) VALUES (1,'epic pain'); INSERT INTO tags3 ( song_id , tag ) VALUES (2,'total queen'); INSERT INTO tags3 ( song_id , tag) VALUES (3,'epic queen'); INSERT INTO tags3 ( song_id , tag ) VALUES (4,'queen epic'); INSERT INTO tags3 (song_id , tag ) VALUES (5,'pain');
【解决方案2】:

三个表:

  • 主键 song_id 是整数的歌曲
  • 主键为 tag 的标签,这是一个字符串
  • songs-tags 是一个junction table,它链接其他两个表。它将具有song_idtag 的复合主键

所以如果在歌曲中我们有这些行 (tuples):

  • 歌曲ID:1;名称:波西米亚狂想曲
  • 歌曲ID:2;名称:我们是冠军

在我们拥有的标签中:

  • 标签:史诗
  • 标签:电影
  • 标签:女王
  • 标签:唱

然后在歌曲标签中我们将拥有:

  • 歌曲ID:1;标签:史诗
  • 歌曲ID:1;标签:电影
  • 歌曲ID:1;标签:女王
  • 歌曲ID:2;标签:史诗
  • 歌曲ID:2;标签:电影
  • 歌曲ID:2;标签:女王
  • 歌曲ID:2;标签:唱

现在要找到匹配特定标签的歌曲只是从歌曲标签表中选择相关行的问题。

原始设计的问题在于您将多个标签存储在一行中。相反,对于与给定歌曲匹配的每个标签,您应该有一个单独的行。如果三个标签匹配,那么您将需要三行等等。

您可能需要阅读一些关于 database normalization 的内容,以了解为什么您的原始设计无法有效运行

(注意在 Joe K 之前的回答中,他基本上提出了同样的建议,并给了你一个 SQL 查询来确定哪些标签与哪些歌曲匹配。我刚刚充实了一些内容)

【讨论】:

    猜你喜欢
    • 2011-11-30
    • 2012-01-24
    • 2017-05-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 2021-08-23
    • 1970-01-01
    相关资源
    最近更新 更多