CREATE TABLE author
(
id bigserial NOT NULL,
"name" text NOT NULL,
author_key text NOT NULL,
CONSTRAINT author_key PRIMARY KEY (id),
CONSTRAINT "key" UNIQUE (author_key)
)
WITH (
OIDS=FALSE
);
我们为该表的的name字段创建一个全文索引,并将它的信息独立的存储在一个表中,表如下:
CREATE TABLE full_text_index
(
id bigserial NOT NULL,text_fti tsvector NOT NULL,)WITH ( OIDS=FALSE);ALTER TABLE full_text_index OWNER TO postgres;
);
CREATE OR REPLACE FUNCTION node_text_fti()
RETURNS trigger AS
$BODY$begin
if TG_OP = 'INSERT' then
insert into full_text_index (text_fti) values(to_tsvector(coalesce(NEW.name,'')));
end if;
return NEW;end;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION node_text_fti() OWNER TO postgres;
CREATE TABLE test_fti
(
"ID" integer NOT NULL DEFAULT nextval('"testFTI_ID_seq"'::regclass),
"content" text NOT NULL,
content_fti tsvector,
CONSTRAINT "testID" PRIMARY KEY ("ID")
)
WITH (
OIDS=FALSE
);
ALTER TABLE test_fti OWNER TO postgres;
此处的字段content_fti则是存储全文索引的信息,此处也类似需要创建触发器函数:
CREATE OR REPLACE FUNCTION messages_trigger()
RETURNS trigger AS
$BODY$
begin
new.content_fti :=
setweight(to_tsvector( coalesce(new.content,'')));
return new;
end
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION messages_trigger() OWNER TO postgres;
在表test处创建一个触发器:
CREATE TRIGGER ftitesttrigger
BEFORE INSERT OR UPDATE
ON test_fti
FOR EACH ROW
EXECUTE PROCEDURE messages_trigger();