1

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

现在搜索单个关键字可以工作,而且速度非常快。

但是,搜索多个关键字 like 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”,我希望结果中首先出现带有“a”和“b”的 ID。

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

4

3 回答 3

1

这样的事情怎么样?

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

于 2011-06-28T14:39:00.833 回答
0

MySQL 具有返回相关性分数的全文搜索。

于 2011-06-28T14:22:11.490 回答
0

好吧,我自己想通了。

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

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

usort($results, 'SortFrequency');
于 2011-06-28T14:52:56.453 回答