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

Rob*_*Rob 20 mysql sql text-processing word-count

我最近一直致力于一些数据库搜索功能,并希望得到一些信息,如每个文档的平均单词(例如数据库中的文本字段).到目前为止我唯一找到的东西(没有在DB之外选择的语言处理)是:

SELECT AVG(LENGTH(content) - LENGTH(REPLACE(content, ' ', '')) + 1)
FROM documents
Run Code Online (Sandbox Code Playgroud)

这似乎有效*但你有其他建议吗?我目前正在使用MySQL 4(希望尽快转移到这个应用程序的第5版),但我也对一般解决方案感兴趣.

谢谢!

*我可以想象这是一个非常粗略的方法来确定它,因为它不会在内容等中考虑HTML.对于这个特定的项目来说没关系但是还有更好的方法吗?

更新:用"更好"来定义我的意思:更准确,更高效,或更"正确"(易于维护,良好实践等).对于我可用的内容,上面的查询足够快,并且对于这个项目是准确的,但我将来可能需要类似的东西(所以我问).

out*_*tis 41

MySQL的文本处理功能不够好,无法满足您的需求.存储的函数是一个选项,但可能会很慢.在MySQL中处理数据的最佳选择是添加用户定义的函数.如果您打算构建更新版本的MySQL,您还可以添加本机功能.

"正确"的方法是处理数据库外部的数据,因为数据库用于存储而不是处理,任何繁重的处理都可能会给DBMS带来太多负担.此外,计算MySQL之外的单词计数可以更容易地更改计为单词的定义.如何在数据库中存储字数并在更改文档时更新它?

示例存储函数:

DELIMITER $$
CREATE FUNCTION wordcount(str LONGTEXT)
       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);
    SET idx = 1;
    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 ;
Run Code Online (Sandbox Code Playgroud)


Jul*_*les 5

这要快得多,但准确性稍差一些。我发现它的计数为 4%,这对于“估计”场景来说是可以的。

SELECT
    ROUND (   
        (
            CHAR_LENGTH(content) - CHAR_LENGTH(REPLACE (content, " ", "")) 
        ) 
        / CHAR_LENGTH(" ")        
    ) AS count    
FROM documents
Run Code Online (Sandbox Code Playgroud)