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

标签 mysql sql text-processing word-count

我最近一直在研究一些数据库搜索功能,并希望获得一些信息,例如每个文档的平均单词数(例如数据库中的文本字段)。到目前为止我发现的唯一一件事(没有在数据库外选择语言处理)是:

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

这似乎可行* 但您还有其他建议吗?我目前正在使用 MySQL 4(希望尽快将此应用程序迁移到版本 5),但我也对通用解决方案感兴趣。

谢谢!

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

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

最佳答案

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

“正确”的方法是在 DB 之外处理数据,因为 DB 是用于存储而不是处理,任何繁重的处理都可能会给 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 ;

关于mysql - 使用 SQL 确定文本字段的字数统计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/748276/

相关文章:

php - 如何将 WHERE 子句的一部分分配给它的多个其他部分?

html - 定制数字 Assets 管理工具 - 从哪里开始

mysql - 复杂的 MySQL 左连接查询

sql - 如何在 hive 中结合拆分和计数

mysql - 如何检索 MySQL 数据库管理系统 (DBMS) 的当前版本?

mysql - 为什么我的查询不允许我分配主键?

sql - 表 A 的 PK 被表 B 的 FK 引用。不能丢弃表 A 的 PK

python - 在 Python 中从文本/PDF 生成 XML 的最佳 Python 库是什么?

sed - 如何只用sed替换一行中的最后一场比赛?

c - 替换文本文档中的行的最有效方法?