Mysql 计算一个单词在一行中的出现次数

Mysql 计算一个单词在一行中的出现次数,mysql,sql,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

我有一个搜索查询,它能够根据查询中实际出现的单词数量按相关性对结果进行排序

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 

然而,这个查询并没有根据“枪”或“关键”出现的次数排序。我想让更多出现“枪”的记录出现在出现次数较少的记录之上。(也就是说,每次gun出现时都添加一个点,而不是添加一个点,因为gun至少出现一次)

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

请参阅此处的文档:

这是一个有用的问题,提供了一些示例,可能有助于:

最后,如果您不能选择全文搜索,那么Andrew Hanna在string functions引用上发表的评论可能会起到以下作用:(在页面中搜索“Andrew Hanna”)。它们在服务器上创建一个函数,可以计算字符串出现的次数


希望这有帮助。

我可能错了,但如果不使用存储过程或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。

谢谢您的评论,我刚刚决定继续使用sphinx作为我们的用例。很酷,谢谢您的接受!Sphinx是一个有趣的索引工具。