我有一个搜索查询,可以根据查询中实际显示的单词数量,按相关性对结果进行排序。
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,每次枪出现时加点,而不是加点,因为枪至少出现一次)
答案 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”页面)。它们在服务器上创建一个函数,可以计算字符串出现的次数。
希望这有帮助。