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_vector
indeksu łą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...OR
zapytania:
... 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.
title
Into thebody
a 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.