1.使用pg全文检索功能,首先需要创建的是分词器;
下面是创建zhparser
类型的分词器,名为zhcfg
。
DROP text SEARCH CONFIGURATION IF EXISTS zhcfg ;
CREATE TEXT SEARCH CONFIGURATION zhcfg (PARSER = zhparser);
ALTER TEXT SEARCH CONFIGURATION zhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;
2.根据业务需求,我们是需要创建中间表dms_file_label_new,但在创建之前,谨慎的做法是先删除它,前提是存在。如果真的存在呢,那我们之前创建的索引也是要提前删除的,那就需要这样操作。
DROP INDEX IF EXISTS idx_dms_file_label_label_classify2;
DROP INDEX IF EXISTS idx_ts_gin1;
DROP INDEX IF EXISTS idx_ts_gin2;
DROP INDEX IF EXISTS idx_ts_gin3;
(以上是删除索引)
DROP TABLE IF EXISTS dms_file_label_new;
(删除表)
CREATE TABLE dms_file_label_new (
id serial NOT NULL,
file_id int4 ,
file_name varchar(1024) NULL,
file_content TEXT,
label_ids varchar(2048) NULL,
label_names varchar(2048) NULL,
rela_id int4[],
system_id varchar(21),
created_by_name varchar(20),
updated_by_name varchar(20),
file_type varchar(5),
file_url varchar(100),
iobs_file_id varchar(100),
labelDTOs varchar(100),
is_valid varchar(32) NULL,
created_by varchar(100) NOT NULL,
created_date timestamp NOT NULL,
updated_by varchar(100) NOT NULL,
updated_date timestamp NOT NULL,
report_time date,
publish_date date,
token_status char(1),
tokens tsvector,
CONSTRAINT PK_dms_file_label_new PRIMARY KEY (id)
);
(创建表)
create sequence if not exists dms_file_label_new_file_id_seq increment by 1 minvalue 1 no maxvalue start with 1;
alter table dms_file_label_new alter column "id" set default nextval('dms_file_label_new_file_id_seq');
(创建序列,并赋值给id)
CREATE INDEX idx_dms_file_label_label_classify2 ON dms_file_label_new USING btree (is_valid, file_id);
(创建聚合索引)
CREATE INDEX idx_dms_file_label_new_gin ON public.dms_file_label_new USING GIN (tokens);
(创建全文索引)
-- 角色授权
GRANT SELECT,UPDATE,INSERT,DELETE ON TABLE dms_file_label_new TO dmsdataopr;
grant all on sequence dms_file_label_new_file_id_seq TO dmsdataopr;
GRANT DELETE, INSERT, SELECT, UPDATE ON dms_file_label_new TO r_dmsdatadata_dml;
GRANT SELECT ON dms_file_label_new TO r_dmsdatadata_qry, r_dmsdatadata_dev_qry;
对于tokens字段,我们是创建表的时候一同创建的,作用就是用来存放分词的。什么时候存放?就是在同步数据时,我们会把全文检索的字段分词后数据进行存放,目的就是在查询的时候不需要再次分词查询,如果每查询一次就分词一次,那么效率将会大大降低。
3.以上均为查询前准备,前提是字段在使用前已经创建完成