有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在SQL中使用关键字对搜索结果进行java排名

我很难开始这个想法。我有一个SQL数据库和一个带有JAVA/Apache(tomcat)的html接口。我试图建立一个简单的数据库,对歌曲的名称进行排序,并与歌曲的关键字进行匹配。 例如,我输入了“epic,movies,queen,sing”这样的关键词,以及“queen bohemian rhapsody”这样的歌曲符合大多数标准。这是一首“电影”中的“epic”歌曲,由“queen”演唱,因此值为3。 而且在数据库中,像queen we is champion这样的歌曲会遇到所有关键词(史诗、电影、queen、sing)——>;所以这首歌应该是4

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

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


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

我的第一个想法是将名称添加到连接表中

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

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

我想我缺少了一些简单的SQL能力来更好地(和更有效地)处理数据


共 (2) 个答案

  1. # 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

  2. # 2 楼答案

    三张桌子:

    • 主键song_id为整数的歌曲
    • 主键为tag的标签,这是一个字符串
    • songs标签是一个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查询,以确定哪些标签与哪些歌曲匹配。我刚刚对内容进行了进一步充实。)