在SQL中使用关键字排序搜索结果

时间:2012-08-23 22:00:30

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

我无法启动这个想法。我有一个SQL数据库和一个带有JAVA / Apache(tomcat)的html接口。我试图创建一个简单的数据库,将歌曲的名称和匹配关于歌曲的关键词排序。 示例我输入的关键字如"史诗,电影,女王,唱歌"像波西米亚女王狂想曲这样的歌曲符合大多数标准,这是一部史诗般的歌曲。来自电影"由女王"女王"所以这会使值为3。 而且在数据库中,像皇后一样的歌我们是冠军会遇到所有关键词(史诗,电影,女王,唱歌) - >所以这首歌将是4。

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

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


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

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

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

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

我认为我在SQL能力方面缺少一些能够更好地(更有效地)处理数据的东西。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

三张桌子:

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

因此,如果在歌曲中我们有这些行(tuples):

  • song_id:1;名称:波希米亚狂想曲
  • song_id:2;名字:我们是冠军

在标签中我们有:

  • tag:epic
  • tag:movie
  • tag:queen
  • tag:sing

然后在歌曲标签中我们会:

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

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

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

您可能希望阅读一些关于database normalization的内容,以了解原始设计无法有效运作的原因

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