Mi sono imbattuto nella ricerca full-text in postgres negli ultimi giorni e sono un po 'confuso riguardo all'indicizzazione durante la ricerca su più colonne.
I documenti di postgres parlano della creazione di un ts_vector
indice su colonne concatenate, in questo modo:
CREATE INDEX pgweb_idx ON pgweb
USING gin(to_tsvector('english', title || ' ' || body));
che posso cercare in questo modo:
... WHERE
(to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo'))
Tuttavia, se a volte volessi cercare solo il titolo, a volte solo il corpo, a volte entrambi, avrei bisogno di 3 indici separati. E se aggiungessi in una terza colonna, potrebbero essere potenzialmente 6 indici e così via.
Un'alternativa che non ho visto nei documenti è solo quella di indicizzare le due colonne separatamente e quindi usare solo una WHERE...OR
query normale :
... WHERE
(to_tsvector('english', title) @@ to_tsquery('english','foo'))
OR
(to_tsvector('english', body) @@ to_tsquery('english','foo'))
Il benchmarking dei due su ~ 1 milione di file sembra non avere praticamente alcuna differenza nelle prestazioni.
Quindi la mia domanda è:
Perché dovrei concatenare gli indici in questo modo, piuttosto che indicizzare le colonne singolarmente? Quali sono i vantaggi / gli svantaggi di entrambi?
La mia ipotesi migliore è che se avessi saputo in anticipo avrei sempre voluto cercare entrambe le colonne (mai una alla volta) avrei bisogno di un solo indice concatenando quale usa meno memoria.
title
nelbody
e quindi indicizzare che possa dare molto valore, anche se io sono aperto a correzione. Probabilmente mi limiterei a indicizzarli separatamente. Inoltre, se è stato un po 'stravagante che in qualche modo ti ha richiesto di concatenare, quindi immagino che potresti semplicemente eseguire la query ad-hoc.