W ciągu ostatnich kilku dni natknąłem się na wyszukiwanie pełnotekstowe w postgresie i jestem trochę zdezorientowany co do indeksowania podczas przeszukiwania wielu kolumn.
Postgres'a docs mówić o tworzeniu ts_vectorindeksu łączonych kolumn, tak jak poniżej:
CREATE INDEX pgweb_idx ON pgweb
USING gin(to_tsvector('english', title || ' ' || body));
które mogę wyszukać tak:
... WHERE
(to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo'))
Jednak gdybym chciał czasami wyszukać tylko tytuł, czasem tylko ciało, a czasem oba, potrzebowałbym 3 osobnych indeksów. A jeśli dodam w trzeciej kolumnie, może to być 6 indeksów i tak dalej.
Alternatywą, której nie widziałem w dokumentacji, jest po prostu oddzielne zaindeksowanie dwóch kolumn, a następnie użycie zwykłego WHERE...ORzapytania:
... WHERE
(to_tsvector('english', title) @@ to_tsquery('english','foo'))
OR
(to_tsvector('english', body) @@ to_tsquery('english','foo'))
Benchmarking dwóch w ~ 1 milionach rzędów wydaje się zasadniczo nie mieć różnicy w wydajności.
Więc moje pytanie brzmi:
Dlaczego miałbym chcieć łączyć takie indeksy, a nie tylko pojedynczo indeksować kolumny? Jakie są zalety / wady obu?
Domyślam się, że gdybym wiedział wcześniej, chciałbym tylko przeszukiwać obie kolumny (nigdy pojedynczo), potrzebowałbym tylko jednego indeksu, łącząc te, które zużywają mniej pamięci.
titleInto thebodya następnie indeksowanie że dałby wiele wartości, ale jestem otwarty na korekty. Prawdopodobnie trzymałbym się ich indeksowania osobno. Ponadto, jeśli był to jakiś zwariowany, jednorazowy przypadek, który w jakiś sposób wymagał od ciebie konkatenacji, to myślę, że możesz po prostu uruchomić zapytanie ad-hoc.