2009-04-14 39 views
16

我最近一直在研究某些数据库搜索功能,并希望获取一些信息,如每个文档的平均字数(例如数据库中的文本字段)。我已经(在数据库之外选择的语言,而不处理)迄今为止发现的唯一的事情就是:使用SQL来确定文本字段的字数统计

SELECT AVG(LENGTH(content) - LENGTH(REPLACE(content, ' ', '')) + 1) 
FROM documents 

这似乎是工作,但*你有其他的建议?我目前正在使用MySQL 4(希望尽快转到第5版),但我也对通用解决方案感兴趣。

谢谢!

*我可以想象,这是一个非常粗糙的方式来确定这一点,因为它没有考虑内容中的HTML等。对于这个特定的项目来说没问题,但是再一次有更好的方法吗?为了定义我的意思是“更好”:要么更准确,更有效率地执行,要么更“正确”(易于维护,良好的实践等)。对于我可用的内容,上面的查询速度足够快,对于这个项目来说是准确的,但我可能在将来需要类似的东西(所以我问)。

+0

您需要定义“更好” – 2009-04-14 17:56:02

回答

33

MySQL的文本处理能力不足以满足您的需求。存储的函数是一个选项,但可能会很慢。在MySQL中处理数据的最佳方法是添加user defined function。如果你打算建立一个更新版本的MySQL,你也可以添加一个native function

“正确”的方法是处理数据库外部的数据,因为数据库用于存储,而不是处理,任何繁重的处理可能会给数据库管理系统带来太多的负载。此外,计算MySQL以外的字数可以更容易地改变什么算作单词的定义。如何将字数存储在数据库中并在更改文档时进行更新?

实例存储功能:

DELIMITER $$ 
CREATE FUNCTION wordcount(str TEXT) 
     RETURNS INT 
     DETERMINISTIC 
     SQL SECURITY INVOKER 
     NO SQL 
    BEGIN 
    DECLARE wordCnt, idx, maxIdx INT DEFAULT 0; 
    DECLARE currChar, prevChar BOOL DEFAULT 0; 
    SET maxIdx=char_length(str); 
    WHILE idx < maxIdx DO 
     SET currChar=SUBSTRING(str, idx, 1) RLIKE '[[:alnum:]]'; 
     IF NOT prevChar AND currChar THEN 
      SET wordCnt=wordCnt+1; 
     END IF; 
     SET prevChar=currChar; 
     SET idx=idx+1; 
    END WHILE; 
    RETURN wordCnt; 
    END 
$$ 
DELIMITER ; 
1

这是一个相当快一点,但只要稍微不太准确。我发现它在计数上有4%的亮度,这对于“估计”场景是可以的。

SELECT 
    ROUND ( 
     (
      CHAR_LENGTH(content) - CHAR_LENGTH(REPLACE (content, " ", "")) 
     ) 
     /CHAR_LENGTH(" ")   
    ) AS count  
FROM documents