是否可以从 Postgres 中包含文本字符串的字段中识别不同的单词和每个单词的计数?
问问题
11995 次
3 回答
23
像这样的东西?
选择一些_pk, regexp_split_to_table(some_column, '\s') as word FROM some_table
获得不同的单词很容易:
选择不同的词 从 ( 选择 regexp_split_to_table(some_column, '\s') 作为单词 FROM some_table ) 吨
或获取每个单词的计数:
选择单词,计数(*) 从 ( 选择 regexp_split_to_table(some_column, '\s') 作为单词 FROM some_table ) 吨 按单词分组
于 2011-03-07T23:06:03.967 回答
15
您还可以为此使用 PostgreSQL 文本搜索功能,例如:
SELECT * FROM ts_stat('SELECT to_tsvector(''hello dere hello hello ridiculous'')');
将产生:
word | ndoc | nentry
---------+------+--------
ridicul | 1 | 1
hello | 1 | 3
dere | 1 | 1
(3 rows)
(PostgreSQL 应用与语言相关的词干和停用词删除,这可能是您想要的,也可能不是。可以通过使用simple
而不是english
字典来禁用停用词删除和词干,见下文。)
嵌套SELECT
语句可以是产生 tsvector 列的任何 select 语句,因此您可以替换一个函数,该函数将该to_tsvector
函数应用于任意数量的文本字段,并将它们连接成单个tsvector
,覆盖文档的任何子集,例如:
SELECT * FROM ts_stat('SELECT to_tsvector(''english'',title) || to_tsvector(''english'',body) from my_documents id < 500') ORDER BY nentry DESC;
将产生一个总字数矩阵,该矩阵取自前 500 个文档的title
和body
字段,按出现次数降序排列。对于每个单词,您还将获得它出现在(ndoc
列)中的文档数量。
有关详细信息,请参阅文档:http ://www.postgresql.org/docs/current/static/textsearch.html
于 2014-07-24T09:42:28.477 回答
6
单词之间应该用空格 ' ' 或其他分隔符分隔;不是用“s”,除非打算这样做,例如,将“myWordshere”视为“myWord”和“here”。
SELECT word, count(*)
FROM (
SELECT regexp_split_to_table(some_column, ' ') as word
FROM some_table
) t
GROUP BY word
于 2012-06-19T17:23:00.900 回答