2011-03-07 313 views

回答

14

像这样的东西?

 
SELECT some_pk, 
     regexp_split_to_table(some_column, '\s') as word 
FROM some_table 

获取区别词随后容易:

 
SELECT DISTINCT word 
FROM ( 
    SELECT regexp_split_to_table(some_column, '\s') as word 
    FROM some_table 
) t 

或获取的计对每个字:

 
SELECT word, count(*) 
FROM ( 
    SELECT regexp_split_to_table(some_column, '\s') as word 
    FROM some_table 
) t 
GROUP BY word 
+0

取决于你的数据,它也可能有助于将列包装在'lower()' – Brandon 2018-03-11 02:39:35

4

应该用一个空格“”或之间的其它划符号被分割话;而不是's',除非有意这样做,例如将'myWordshere'视为'myWord'和'here'。

SELECT word, count(*) 
FROM ( 
    SELECT regexp_split_to_table(some_column, ' ') as word 
    FROM some_table 
) t 
GROUP BY word 
+4

\ s是一个有效的正则表达式字符集,适用于任何空白字符 – 2014-09-30 04:27:02

+0

我低估了,因为答案显然误解了正则表达式。 – Private 2016-06-13 09:33:02

13

你也可以使用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字典来禁用停用词移除和词干化, ee值以下。)

嵌套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