我的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
。
答案 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')));