如何在PostgreSQL中统计纯文本单词数?Postgres 9.5去HTML标签统计方法
嘿,我来帮你搞定这两个PostgreSQL的问题!
1. 统计纯文本的单词数量
对于纯文本内容,我们可以借助正则表达式分割字符串,再过滤空元素来统计单词数。这里有两种简洁的实现方式:
第一种是用regexp_split_to_array配合COUNT:
SELECT COUNT(*) AS word_count FROM regexp_split_to_array('Lorem Ipsum dolor sit amet', '\W+') AS words WHERE words <> '';
第二种更紧凑,用array_length和array_remove组合:
SELECT array_length(array_remove(regexp_split_to_array('Lorem Ipsum dolor sit amet', '\W+'), ''), 1) AS word_count;
这里的\W+表示匹配一个或多个非单词字符(比如空格、标点),用来分割单词;array_remove是为了删掉分割后产生的空字符串(比如文本首尾的空格导致的空元素)。
2. 去除HTML标签后统计纯文本的指标
PostgreSQL 9.5没有内置的HTML解析工具,不过我们可以用正则表达式写一个自定义函数来去除标签、属性和HTML实体,之后再统计单词数和长度。
第一步:创建去除HTML的函数
先定义一个strip_html_tags函数,处理HTML内容:
CREATE OR REPLACE FUNCTION strip_html_tags(html text) RETURNS text AS $$ BEGIN -- 移除所有HTML标签(包括标签内的属性) html := regexp_replace(html, '<[^>]+>', '', 'g'); -- 替换常见的HTML实体为对应字符 html := regexp_replace(html, '<', '<', 'g'); html := regexp_replace(html, '>', '>', 'g'); html := regexp_replace(html, '&', '&', 'g'); html := regexp_replace(html, ' ', ' ', 'g'); -- 把连续的空白字符替换成单个空格 html := regexp_replace(html, '\s+', ' ', 'g'); -- 去除首尾的空白 html := trim(html); RETURN html; END; $$ LANGUAGE plpgsql IMMUTABLE;
第二步:使用函数统计指标
假设你的表名为your_table,存储HTML的字段是html_content,可以这样查询:
SELECT html_content, strip_html_tags(html_content) AS plain_text, length(strip_html_tags(html_content)) AS text_length, -- 处理空文本的情况,避免报错 CASE WHEN strip_html_tags(html_content) = '' THEN 0 ELSE array_length(array_remove(regexp_split_to_array(strip_html_tags(html_content), '\W+'), ''), 1) END AS word_count FROM your_table;
注意事项
用正则处理HTML不是100%完美的,比如遇到嵌套异常的标签、注释或者特殊的脚本标签时可能处理不彻底,但对于大多数常规的HTML内容(像你给出的示例文本),这个函数已经足够好用了。
内容的提问来源于stack exchange,提问作者wbn205
相关产品推荐
相关产品推荐

