我正在尝试在Postgres中实现基本的全文搜索。我对物化视图和索引提出了一些改进搜索的问题:
我使用物化视图将搜索数据存储在一个名为document的列中(数据类型:tsvector)。我有大约1000条记录,当我尝试使用或不使用索引进行某些查询时,搜索时间是相同的。
那么我需要在此视图上使用索引吗?
哪种类型的指数更好,GIN还是GIST? (我每天还有1-2条记录,很少更新)
插入记录后,我需要刷新物化视图。
如果我使用INDEX,我需要REINDEX吗?
当视图刷新时,使用它的查询必须等待刷新完成。如何解决?
编辑:
我使用命令创建物化视图:
CREATE MATERIALIZED VIEW search_index AS
SELECT p.id AS id, p.title AS title, p.published_at as published_at, u.name AS author,
setweight(to_tsvector('simple', unaccent(p.title)), 'A') ||
setweight(to_tsvector('simple', unaccent(p.content)), 'B') ||
setweight(to_tsvector('simple', unaccent(u.name)), 'C') AS document
FROM posts AS p
JOIN users AS u ON p.created_by = u.id
搜索查询(使用键'框架'的示例):
SELECT * FROM search_index
WHERE document @@ plainto_tsquery('simple', 'framework')
ORDER BY published_at DESC
创建索引:
CREATE INDEX idx_fts_search ON search_index USING GIN(document);
=>搜索时间约为185毫秒(167行)甚至使用索引。