2015-04-15 75 views
2

我有一個posts,它有一列tags。我希望能夠在標籤上進行全文搜索。對於VARCHAR列我使用:Postgres全文檢索Array列

CREATE INDEX posts_fts_idx ON posts USING gin(to_tsvector('english', coalesce(title, '')); 
SELECT "posts".* FROM "posts" WHERE (to_tsvector('english', coalesce(title, '')) @@ (to_tsquery('english', 'ruby'))); 

然而,character varying[]功能to_tsvector不存在。如何編寫一個針對每個標籤運行的查詢(理想情況下是否匹配任何單個標籤匹配)?

注:我看,這將是很容易做到轉換爲字符串(array_to_string),但如果可能的話,我想每一個人標籤轉換爲tsvector

回答

1

您可以使用杜松子酒爲搜索選項編制索引字符。試試這個:

CREATE INDEX idx_post_tag ON posts USING GIN(tags); 

SELECT * FROM posts WHERE tags @> (ARRAY['search string'::character varying]); 

這是當需要精確匹配時。如果不需要完全匹配,則應考慮將標籤存儲爲文本列。更多地考慮這些「標籤」的重要性。字符串數組類型缺少文本索引,詞幹和變形支持,因此您將無法匹配諸如「舞蹈」和「舞蹈」等bates。

如果這不是一個選項,你可以用一個不可變的array_to_string函數來繞過這個問題。您的查詢然後是:

CREATE INDEX posts_fts_idx ON posts USING gin(to_tsvector('english', immutable_array_to_string(tags, ' '))); 
SELECT "posts".* FROM "posts" WHERE (to_tsvector('english', immutable_array_to_string(tags, ' ')) @@ (to_tsquery('english', 'ruby'))); 
+0

感謝您的迴應,但不會使用全文搜索。這需要精確匹配,並且不會考慮拼寫和英語的相似性(即跳舞與跳舞)。 –

+0

是的,我有點在我的問題中提出 - 我試圖在數組的每個元素上應用tsvector - 不加入數組然後應用。問題是這將匹配標籤之間的字符串。 –

+0

爲了達到這個目的,你必須將標籤移動到一個單獨的表格中。我沒有看到任何其他的可能性。 – TavoloPerUno