我已经建立了一个搜索索引(两个列表),它将单个关键字分配给他们的内容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上的命中频率对输出进行排序,同时仍然很快?
答案 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');