2016-03-16 60 views
0

tsvectot的一個典型和相關的應用是查詢和彙總有關發生的單詞集及其頻率的信息......並且JSONB是代表這些「查詢應用程序」的tsvectot數據類型的自然選擇(!)...所以,如何轉換tsvector?

有一個簡單的解決方法將轉換成轉換成JSONB

例子:計數緩存tsvectot的的話的全球頻率,將是這樣的查詢

SELECT r.key as word, SUM(r.value) as occurrences 
FROM (
    SELECT jsonb_each(kx_tsvectot::jsonb) as r FROM terms 
) t 
GROUP BY 1; 

回答

2

您可以使用ts_stat()功能,這會給你你需要的東西

word text - 一個詞位的值
ndoc intge的R - 許多文獻(tsvectors)發生在
nentry字整數 - 字的出現總數

實施例可以是以下:

CREATE TABLE t (
    tsv TSVECTOR 
); 
INSERT INTO t VALUES 
    ('word'::TSVECTOR), 
    ('second word'::TSVECTOR), 
    ('third word'::TSVECTOR); 

SELECT * FROM 
    ts_stat('SELECT tsv FROM t'); 

結果:

word | ndoc | nentry 
--------+------+-------- 
word | 3 |  3 
third | 1 |  1 
second | 1 |  1 
(3 rows) 

如果您仍想將其轉換爲jsonb您可以使用c ast word from text to jsonb

+0

感謝您的幫助! [我的鏈接](http://www.postgresql.org/docs/current/static/textsearch-controls.html)沒有提及[ts_stats](http://www.postgresql.org/docs/current/static/ textsearch-features.html),所以提及** + 1 **,並以讀者的教學形式公開使用(!)......這不是被接受的答案,只是因爲它不是「我的夢想」: - )這個夢是對內部二進制表示的簡單而快速的轉換,非常相似,所以需要快速轉換。讓我們看看另一個是否顯示了更多的線索。 –

+0

好吧,在這種情況下,您需要執行以下操作((tsvector_val):: TEXT)1st,但要使用'regexp_split_to_array()'以便從'TEXT'獲取所有詞位並執行轉換爲' JSONB'和聚合與計數()@PeterKrauss –

+0

是的,它的工作原理,但正則表達式轉換是如此多的CPU消耗比一個簡單的內部轉換,我解釋了...二進制信息存在,並沒有理性不要使用它。 –