Iniciante na pesquisa de texto completo, tenho uma tabela feed_items da seguinte forma
feed_items (...title varchar, summary varchar, fullarticle varchar,...)
Eu quero criar uma coluna ts_vector para pesquisar a consulta do título ou do resumo com maior prioridade dada se a consulta for encontrada no título.
Opção 1 eu posso criar uma coluna gerada que fica assim
ALTER TABLE feed_items
ADD COLUMN textsearchable_index_col tsvector
GENERATED ALWAYS AS (to_tsvector('english', coalesce(title, '') || ' ' || coalesce(summary, ''))) STORED;
Opção 2 posso criar uma trigger após inserir ou atualizar assim, o exemplo abaixo não é perfeito, criei uma coluna separada para title_vector e summary_vector mas acho que preciso mesclá-los em uma coluna e ainda decidir como dar mais importância a consulta encontrada no título
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$);
Minha principal dúvida é qual a diferença entre os dois? e qual devo usar?
O método de disparo é obsoleto. Se você estiver usando uma versão que dá suporte ao uso de colunas geradas em expressões, você deve usá-las. E se você está iniciando um novo projeto, você deve absolutamente começar com uma versão pelo menos tão nova (v12).
Acho que as duas formas não são ideais, pois persistem dados desnecessários.
Eu não adicionaria uma coluna extra, mas definiria um índice GIN na expressão:
concat
trata valores NULL como strings vazias, de modo que é mais simples.Sua pesquisa de texto completo terá então