如何按命中频率对关键字搜索结果进行排序?

时间:2011-06-28 14:12:53

标签: mysql search relevance

我已经建立了一个搜索索引(两个列表),它将单个关键字分配给他们的内容ID。

现在搜索单个关键字很有效,而且速度非常快。

然而,搜索多个关键字,如 SELECT media_id, keyword FROM search_index WHERE keyword = 'b' OR keyword = 'a'将按字母顺序排列关键字顺序返回结果(首先是'a'上的所有匹配,然后是'b')。

我尝试在结果页面上使用PHP进行操作,但是这需要我从数据库加载比我想要显示的更多数据,以获得可接受的排序。使用该技术,脚本甚至可能会超时更频繁地分配关键字。

我也试过GROUP BY,它似乎将字母顺序的结果组合成单个ID。

编辑: 最后我找到了像SELECT DISTINCT media_id, keyword, COUNT(media_id) AS num FROM search_index GROUP BY media_id ORDER BY num DESC这样的东西,它的效果很好但很慢。

因此,如果我搜索“b”和“a”,我希望结果中的ID首先为“a”和“b”。

那么我如何告诉MySQL按照一个ID上的命中频率对输出进行排序,同时仍然很快?

3 个答案:

答案 0 :(得分:1)

这样的事情怎么样?

SELECT *,CAST(keyword ='a'AS SIGNED)+ CAST(keyword ='b'AS SIGNED)AS rank FROM search_index ORDER BY RANK DESC

答案 1 :(得分:0)

MySQL有full text search,返回相关性分数。

答案 2 :(得分:0)

好吧,我自己想出来了。

最快的似乎是SELECT media_id, keyword, COUNT(media_id) AS num WHERE ... GROUP BY media_id,然后使用简单的php-usort函数遍历num字段。

function SortFrequency($a, $b)
{
     if ($a['num'] == $b['num']) return 0;
     return ($a['num'] > $b['num']) ? -1 : 1;
}

usort($results, 'SortFrequency');