Ich bin in den letzten Tagen auf die Volltextsuche in Postgres gestoßen, und ich bin etwas verwirrt über die Indizierung, wenn ich über mehrere Spalten hinweg suche.
In den Postgres- Dokumenten wird beschriebents_vector
, wie ein Index für verkettete Spalten erstellt wird:
CREATE INDEX pgweb_idx ON pgweb
USING gin(to_tsvector('english', title || ' ' || body));
was ich so suchen kann:
... WHERE
(to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo'))
Wenn ich jedoch manchmal nur den Titel, manchmal nur den Text und manchmal beides suchen wollte, würde ich 3 separate Indizes benötigen. Und wenn ich in einer dritten Spalte hinzufüge, könnten das möglicherweise 6 Indizes sein und so weiter.
Eine Alternative, die ich in den Dokumenten nicht gesehen habe, besteht darin, die beiden Spalten getrennt zu indizieren und dann einfach eine normale WHERE...OR
Abfrage zu verwenden:
... WHERE
(to_tsvector('english', title) @@ to_tsquery('english','foo'))
OR
(to_tsvector('english', body) @@ to_tsquery('english','foo'))
Das Benchmarking der beiden in ~ 1 Million Zeilen scheint grundsätzlich keinen Leistungsunterschied zu haben.
Meine Frage lautet also:
Warum sollte ich solche Indizes verketten wollen, anstatt nur Spalten einzeln zu indizieren? Was sind die Vor- und Nachteile von beiden?
Meine beste Vermutung ist, dass ich, wenn ich im Voraus wüsste, dass ich immer nur beide Spalten durchsuchen möchte (niemals eine nach der anderen), immer nur einen Index durch Verketten benötigen würde, der weniger Speicher benötigt.
title
inbody
und die anschließende Indizierung viel Wert bringen würde, obwohl ich offen für Korrekturen bin. Ich würde mich wahrscheinlich nur daran halten, sie separat zu indizieren. Wenn es sich um ein verrücktes Einzelstück handelte, bei dem Sie sich irgendwie verketten mussten, können Sie die Abfrage wahrscheinlich einfach ad-hoc ausführen.