【问题标题】:How to sort keyword search results by hit frequency?如何按点击频率对关键字搜索结果进行排序?
【发布时间】:2011-09-24 08:54:23
【问题描述】:

我建立了一个搜索索引(两列表),将单个关键字分配给其内容 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”,我希望结果中首先出现带有“a”和“b”的 ID。

那么我怎样才能告诉 MySQL 按一个 ID 上的命中频率对输出进行排序,同时仍然非常快?

【问题讨论】:

    标签: mysql search relevance


    【解决方案1】:

    这样的事情怎么样?

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,感谢您在此处指出我在搜索索引解决方案中尽量不使用的内容。当然,我可以将所有关键字放在TEXT 字段中并全文搜索它们,但是您是否曾经在 300K+ 行表上感受到类似的性能?我猜不会。 (最多需要一分钟,我的索引可以在几毫秒内提供搜索结果)。
      • 对不起。只是想提供帮助。
      • 非常感谢帮助,真的!但是,当答案违背问题的任何意图时,它就不会在任何地方领先。
      • 不幸的是,并不总是能够清楚地发现问题的意图。我发布了另一个可能更有帮助的答案:)
      【解决方案3】:

      好吧,我自己想通了。

      最快的似乎是做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');
      

      【讨论】:

        猜你喜欢
        • 2012-01-28
        • 2021-10-29
        • 2011-11-26
        • 2013-08-19
        • 2014-05-24
        • 1970-01-01
        • 2010-11-04
        • 2020-09-03
        • 1970-01-01
        相关资源
        最近更新 更多