2012-08-12 173 views
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 

但是,这个查询并不根据“枪”或“关键”出现的次数来排序。我想让它记录更多的“枪”出现在记录上方,出现次数较少。 (IE,加点每次枪显示出来,而不是增加一个点,因为枪至少一次显示出来)

回答

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?

最后,如果全文搜索不适合您的选项,发布该评论由安德鲁汉纳在字符串函数参考可能会做的伎俩:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html(搜索“安德鲁汉纳”页面)。他们在服务器上创建一个函数,可以计算字符串出现的次数。

希望这会有所帮助。

+0

感谢您的评论,我决定去提前使用sphinx作为我们的用例。 – Furyvore 2012-08-13 22:47:55

+0

很酷,谢谢接受!狮身人面像是一个有趣的索引工具。 – cgwyllie 2012-08-21 08:24:36

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)或文本。您现在可以通过查询中使用它,以便:

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) 

如果数据集大和性能对你很重要,我建议编写自定义的UDF在C.

相关问题