数据库 – 动态或列化的tsvector索引?
发布时间:2020-12-12 06:27:31 所属栏目:MsSql教程 来源:网络整理
导读:我正在为我正在构建的网站创建自定义论坛软件,其中包括2个表(与此问题相关):主题和帖子.帖子属于主题,主题包含主题,而每个帖子包含主体. 以下是与我的问题相关的列的基本表结构: CREATE TABLE topics ( id bigserial NOT NULL,title varchar(128) NOT NULL,
我正在为我正在构建的网站创建自定义论坛软件,其中包括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时,您可能可以节省一点时间. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |