2011-03-07 304 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