11

是否可以从 Postgres 中包含文本字符串的字段中识别不同的单词和每个单词的计数?

4

3 回答 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 个文档的titlebody字段,按出现次数降序排列。对于每个单词,您还将获得它出现在(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 回答