使用SQL来确定文本字段的字数统计

我最近一直在研究一些数据库searchfunction,并希望获得一些信息,如每个文档的平均词(例如数据库中的文本字段)。 我迄今发现的唯一的东西(没有在DB以外的select语言处理)是:

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

这似乎工作*但你有其他的build议吗? 我目前正在使用MySQL 4(希望尽快转移到这个应用程序的版本5),但也有兴趣在一般的解决scheme。

谢谢!

*我可以想象,这是一个相当粗糙的方式来确定这一点,因为它并没有考虑内容中的HTML等。 这对于这个特定的项目来说没问题,但是还有更好的方法吗?

更新:定义我的意思是“更好”:要么更准确,更有效率地执行,要么更“正确”(易于维护,良好的实践等)。 对于我提供的内容,上面的查询速度足够快,对于这个项目来说是准确的,但是我将来可能需要类似的东西(所以我问了一下)。

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

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

示例存储function:

 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 ; 

虽然稍微不准确,但速度要快得多。 我发现它的数量是4%,这对于“估算”情况是可以的。

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