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是一个有趣的索引工具。