数据库 – 动态或列化的tsvector索引?

前端之家收集整理的这篇文章主要介绍了数据库 – 动态或列化的tsvector索引?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在为我正在构建的网站创建自定义论坛软件,其中包括2个表(与此问题相关):主题和帖子.帖子属于主题,主题包含主题,而每个帖子包含主体.

以下是与我的问题相关的列的基本表结构:

CREATE TABLE topics (
  id bigserial NOT NULL,title varchar(128) NOT NULL,created timestamp with time zone NOT NULL default NOW(),updated timestamp with time zone NOT NULL default NOW(),PRIMARY KEY (id)
);

CREATE TABLE posts (
  id bigserial NOT NULL,topic_id bigint NOT NULL REFERENCES topics(id) ON DELETE CASCADE,body text NOT NULL,PRIMARY KEY (id)
);

以下是构建全文索引的两个选项.

选项1:在标题/正文列上创建动态tsvector索引.

CREATE INDEX topics_title_idx ON topics USING gin(to_tsvector(title));
CREATE INDEX posts_body_idx ON posts USING gin(to_tsvector(body));

选项2:创建额外的列以保存tsvector化的标题/正文数据,并在其上添加索引.

ALTER TABLE topics ADD COLUMN topics_vector tsvector NOT NULL;
CREATE TRIGGER topics_ins BEFORE INSERT OR UPDATE ON topics FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger(title_vector,'pg_catalog.english',title);
CREATE INDEX topics_title_idx ON topics USING gin(title_vector);

ALTER TABLE posts ADD COLUMN posts_vector tsvector NOT NULL;
CREATE TRIGGER posts_ins BEFORE INSERT OR UPDATE ON posts FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger(body_vector,body);
CREATE INDEX posts_body_idx ON posts USING gin(body_vector);

我在两者之间进行辩论,因为选项1将节省我的磁盘空间,但提供较慢的搜索,而选项2将需要额外的磁盘空间,同时提供更快的搜索.

让我们假装有20个新主题&每天100个新帖子.你会选哪个?如果每天主题/帖子的数量是两倍呢?五倍呢?十次?你的决定是否会改变?

解决方法

使用选项1不会使您的搜索更慢.

无论您是在实例化列还是计算表达式中创建,都将使用GIN索引.

您只需要更改查询语法:

SELECT  *
FROM    posts
WHERE   TO_TSVECTOR('english',title) @@ myquery

在第一种情况下,或

SELECT  *
FROM    posts
WHERE   title_vector @@ myquery

在第二种情况下.

在实例化列上使用TS_RANK时,您可能可以节省一点时间.

猜你在找的MsSQL相关文章