计算单行中单词的出现次数

时间:2012-08-12 21:13:04

标签: mysql sql

我有一个搜索查询,可以根据查询中实际显示的单词数量,按相关性对结果进行排序。

SELECT id, 
       thesis 
FROM   activity p 
WHERE  p.discriminator = 'opinion' 
       AND ( thesis LIKE '%gun%' 
              OR thesis LIKE '%crucial%' ) 
ORDER  BY ( ( CASE 
                WHEN thesis LIKE '%gun%' THEN 1 
                ELSE 0 
              end ) 
          + ( CASE 
                WHEN thesis LIKE '%crucial%' THEN 1 
                ELSE 0 
              end ) ) 
           DESC 

但是,此查询不会根据“枪”或“关键”出现的次数进行排序。我想让它成为如此记录,更多出现的“枪”出现在记录上方,发生次数较少。 (I.E,每次枪出现时加点,而不是加点,因为枪至少出现一次)

2 个答案:

答案 0 :(得分:2)

我可能错了,但没有使用存储过程或UDF您将无法计算字符串出现次数。这是存储函数的样本,用于计算子字符串:

drop function if exists str_count;

delimiter |
create function str_count(sub varchar(255), str varchar(255)) RETURNS INTEGER
DETERMINISTIC NO SQL
BEGIN
    DECLARE count INT;
    DECLARE cur INT;

    SET count = 0;
    SET cur = 0;

    REPEAT
        SET cur = LOCATE(sub, str, cur+1);
        SET count = count + (cur > 0);
    UNTIL (cur = 0)
    END REPEAT;

    RETURN(count);
END|

您可能希望将varchar(255)更改为varchar(65536)或TEXT。您现在可以按查询顺序使用它:

SELECT id, 
       thesis 
FROM   activity p 
WHERE  p.discriminator = 'opinion' 
       AND ( thesis LIKE '%gun%' 
              OR thesis LIKE '%crucial%' ) 
ORDER  BY STR_COUNT('gun',thesis) + STR_COUNT('crucial', thesis)

如果您的数据集很大且性能对您很重要,我建议您在C中编写自定义UDF。

答案 1 :(得分:1)

根据数据库的设置方式,您可能会发现MySQL的全文索引更适合您的用例。它允许您索引字段并在其中搜索单词,按照与出现次数相关的相关性对结果进行排序。

请参阅此处的文档:http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

这是一个有用的问题,提供了一些示例,可能有所帮助:How can I manipulate MySQL fulltext search relevance to make one field more 'valuable' than another?

最后,如果全文搜索不适合您,Andrew Hanna在字符串函数参考上发布的评论可能会起到作用:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html(搜索“Andrew Hanna”页面)。它们在服务器上创建一个函数,可以计算字符串出现的次数。

希望这有帮助。