【问题标题】:Counting occurrences of a word in a single row计算单行中单词的出现次数
【发布时间】:2012-08-09 04:30:56
【问题描述】:

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

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 

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

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      根据您的数据库的设置方式,您可能会发现 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”)。他们在服务器上创建了一个函数,可以计算字符串出现的次数。

      希望这会有所帮助。

      【讨论】:

      • 感谢您的评论,我只是决定继续使用 sphinx 作为我们的用例。
      • 酷,感谢您的接受! Sphinx 是一个有趣的索引工具。
      猜你喜欢
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      • 2023-04-04
      相关资源
      最近更新 更多