Eu encontrei a pesquisa de texto completo no postgres nos últimos dias e estou um pouco confuso sobre a indexação ao pesquisar em várias colunas.
Os documentos do postgres falam sobre a criação de um ts_vector
índice em colunas concatenadas, assim:
CREATE INDEX pgweb_idx ON pgweb
USING gin(to_tsvector('english', title || ' ' || body));
que eu posso pesquisar assim:
... WHERE
(to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo'))
No entanto, se eu quisesse pesquisar apenas o título, às vezes apenas o corpo e, às vezes, ambos, precisaria de três índices separados. E se eu adicionasse em uma terceira coluna, isso poderia ser potencialmente 6 índices, e assim por diante.
Uma alternativa que eu não vi nos documentos é apenas indexar as duas colunas separadamente e usar uma WHERE...OR
consulta normal :
... WHERE
(to_tsvector('english', title) @@ to_tsquery('english','foo'))
OR
(to_tsvector('english', body) @@ to_tsquery('english','foo'))
O benchmarking dos dois em ~ 1 milhão de linhas parece não ter basicamente nenhuma diferença no desempenho.
Então, minha pergunta é:
Por que eu gostaria de concatenar índices como esse, em vez de apenas indexar colunas individualmente? Quais são as vantagens / desvantagens de ambos?
Meu melhor palpite é que, se eu soubesse com antecedência, só desejaria pesquisar nas duas colunas (nunca uma de cada vez) e precisaria apenas de um índice concatenando os que usam menos memória.
title
entradabody
e indexar isso daria muito valor, embora eu esteja aberto à correção. Eu provavelmente ficaria indexando-os separadamente. Além disso, se foi algo excêntrico que exigisse a concatenação, acho que você poderia executar a consulta ad-hoc.