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_vectorindice 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...ORquery 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.
titlenelbodye 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.