加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

数据库 – 动态或列化的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时,您可能可以节省一点时间.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读