1

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

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 

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

4

2 回答 2

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。

于 2012-08-12T22:23:43.707 回答
1

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

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

这是一个有用的问题,它提供了一些示例,并且可能会有所帮助:如何操纵 MySQL 全文搜索相关性以使一个字段比另一个字段更“有价值”?

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

希望这可以帮助。

于 2012-08-12T21:40:51.113 回答