mySQL搜索/ MATCH()AGAINST()帮助

时间:2010-07-31 23:31:07

标签: mysql full-text-search

我有一个歌曲标题数据库。每首歌曲标题都有一个指定的整数分数。分数越高,我的网站排名越高。

因此,如果“Lady Gaga - Poker Face”得分为23039,而“Eminem - Not Afraid”得分为13400,那么Lady Gaga将会超过Eminem。

这当然是通过简单的ORDER BY得分DESC

来完成的

但是,我的网站还有一个搜索功能,人们可以输入关键词短语来返回歌曲标题列表。我使用MATCH()AGAINST()查询这样做:

方法#1

SELECT * FROM links MATCH(songtitle) AGAINST({the keyword}) LIMIT 5';

这有效,但我希望按照得分的顺序显示这5个结果。但是,如果我改为执行此查询:

方法#2

SELECT * FROM links MATCH(songtitle) AGAINST({the keyword}) ORDER BY score DESC LIMIT 5';

然后相关性的顺序完全丢失。我想按分数和相关性来订购返回的结果。

以此示例数据集和方案为例:

数据集:

song title                  |       score
pink - sober                |        2002
pink - funhouse             |        2001
pink floyd - high hopes     |        2000
pink floyd - on the run     |        1999
pink floyd - brain damage   |        1998
pink floyd - money          |        1997
pink floyd - time           |        1996

方案:

  • 当您使用上面的第一个方法搜索“Pink Floyd”时,您会以看似随机的顺序收到5首Pink Floyd歌曲。这很棒,,我希望返回的歌曲按其得分按降序排序。所以你在第一个方法中添加了“ORDER BY得分DESC”,它为你提供了上面的第二个方法......

  • 当您使用上面的 second 方法搜索“Pink Floyd”时,您会按照正确的顺序收到Pink Floyd歌曲(按得分DESC排序),但现在您还会收到两首歌曲由流行艺术家“粉红色”,因为粉红色的数据库中有2首歌曲的得分高于任何Pink Floyd歌曲。

期望的结果:

  • 搜索“Pink Floyd”会返回所有5首粉红色的弗洛伊德歌曲,按照指定的分数降序排列。

  • 搜索“粉红色”按照指定分数的降序返回粉红色的两首歌曲。如果Pink Floyd的歌曲出现在两首Pink歌曲之后,那也没关系。

明白我的意思?如果您需要任何澄清,请告诉我们!

戴夫

1 个答案:

答案 0 :(得分:0)

看起来您可以从匹配中获得“相关性” - 请查看this link。鉴于此,您可以先按相关性排序,然后按分数排序。