全文搜索新手,我有一个feed_items表如下
feed_items (...title varchar, summary varchar, fullarticle varchar,...)
如果在标题中找到查询,我想创建一个 ts_vector 列来从标题或摘要中搜索具有更高优先级的查询。
选项 1 我可以创建一个生成的列,如下所示
ALTER TABLE feed_items
ADD COLUMN textsearchable_index_col tsvector
GENERATED ALWAYS AS (to_tsvector('english', coalesce(title, '') || ' ' || coalesce(summary, ''))) STORED;
选项2 我可以像这样在插入或更新后创建触发器,下面的示例并不完美,我为title_vector和summary_vector创建了一个单独的列,但我认为我需要将它们合并到一个列中,然后决定如何更加重视在标题中找到的查询
ALTER TABLE "feed_items"
ADD IF NOT EXISTS "title_vector" tsvector;
COMMENT ON COLUMN "feed_items"."title_vector" IS $pga$vector representation of title$pga$;
UPDATE feed_items SET title_vector = to_tsvector('english', title);
CREATE INDEX "idx_title_vector" ON "feed_items" USING gin ("title_vector");
CREATE TRIGGER "trigger_update_title_vector"
BEFORE INSERT OR UPDATE ON "feed_items"
FOR EACH ROW
EXECUTE PROCEDURE "tsvector_update_trigger"($pga$title_vector$pga$, $pga$pg_catalog.english$pga$, $pga$title$pga$);
我的主要问题是两者之间有什么区别?我应该使用哪一个?
触发方法已过时。如果您使用的版本支持在表达式上使用生成的列,那么您应该使用它们。而且,如果您要开始一个新项目,则绝对应该从至少是新版本(v12)开始。
我认为这两种方式都不理想,因为它们会保留不必要的数据。
我不会添加额外的列,而是在表达式上定义 GIN 索引:
concat
将 NULL 值视为空字符串,因此更简单。然后您的全文搜索将有