在阵列列上进行Postgres全文搜索

时间:2015-04-15 01:11:37

标签: postgresql

我的posts有一列tags。我希望能够跨标签进行全文搜索。对于我使用的VARCHAR列:

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 个答案:

答案 0 :(得分:1)

您可以使用gin为搜索选项索引变化的字符。试试这个:

CREATE INDEX idx_post_tag ON posts USING GIN(tags);

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

这是需要完全匹配的时候。如果不需要完全匹配,则应考虑将标记存储为文本列。更多地考虑这些“标签”的重要性。字符串数组类型缺少文本索引,词干和变形支持,因此您将无法匹配“舞蹈”和“舞蹈”之类的贝茨。

如果这不是一个选项,你可以使用不可变版本的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')));