为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

慕沐林林 2019-12-04 10:09:45

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


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

FROM documents

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


谢谢!


*我可以想象这是确定它的一种相当粗糙的方法,因为它也没有考虑内容等中的HTML。这个特定项目可以,但是还有更好的方法吗?


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


查看完整描述

3 回答

?
慕雪6173905

MySQL的文本处理功能不足以满足您的需求。存储功能是一个选项,但可能会很慢。在MySQL中处理数据的最佳选择是添加一个用户定义的函数。无论如何,如果要构建MySQL的较新版本,也可以添加一个native函数。


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


查看完整回答
反对 回复 2019-12-04
?
HUH函数

尽管速度略有降低,但速度要快得多。我发现它的计数为4%,对于“估计”方案来说还可以。


SELECT

    ROUND (   

        (

            CHAR_LENGTH(content) - CHAR_LENGTH(REPLACE (content, " ", "")) 

        ) 

        / CHAR_LENGTH(" ")        

    ) AS count    

FROM documents


查看完整回答
反对 回复 2019-12-04
?
弑天下

您可以word_count()从https://github.com/spachev/mysql_udf_bundle使用UDF 。我从接受的答案中移植了逻辑,不同之处在于我的代码仅支持latin1字符集。需要重新设计逻辑以支持其他字符集。同样,两种实现方式始终将非字母数字字符视为定界符,这可能并不总是令人满意的,例如,两种实现方式都将“教师用书”视为三个单词。

UDF版本当然要快得多。为了进行快速测试,我对来自Guttenberg项目的数据集(包括9751条记录,共约3 GB)进行了尝试。UDF在18秒内完成了所有这些操作,而存储的功能仅用63秒即可处理30条记录(UDF在0.05秒内完成)。因此,在这种情况下,UDF的速度大约快1000倍。

UDF将在不涉及修改MySQL源代码的速度上击败其他任何方法。这是因为它可以访问内存中的字符串字节,并且可以直接对字节进行操作,而不必移动它们。它还被编译为机器代码,并直接在CPU上运行。


查看完整回答
反对 回复 2019-12-04

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信