Останні кілька днів я натрапив на пошук повного тексту в постграфах, і я трохи не збентежений щодо індексації під час пошуку в декількох стовпцях.
У Postgres документах говорити про створення ts_vector
індексу на зчеплених шпальтах, наприклад , так:
CREATE INDEX pgweb_idx ON pgweb
USING gin(to_tsvector('english', title || ' ' || body));
яку я можу шукати так:
... WHERE
(to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo'))
Однак, якби я хотів іноді шукати лише заголовок, іноді лише тіло, а іноді і те й інше, мені знадобляться 3 окремі індекси. І якби я додав у третій стовпчик, це потенційно може бути 6 індексів тощо.
Альтернатива, яку я не бачив у документах, - це просто індексувати два стовпці, а потім просто використати звичайний WHERE...OR
запит:
... WHERE
(to_tsvector('english', title) @@ to_tsquery('english','foo'))
OR
(to_tsvector('english', body) @@ to_tsquery('english','foo'))
Бенчмаркінг двох на ~ 1 мільйон рядків, схоже, в принципі не має різниці в продуктивності.
Отже, моє питання:
Чому я б хотів об'єднати такі індекси, а не просто індексувати стовпці окремо? Які переваги / недоліки обох?
Я найкраще здогадуюсь, що якби я знав заздалегідь, я хотів би коли-небудь шукати обидва стовпчики (ніколи не одну за одною), мені знадобився б лише один індекс шляхом об'єднання, які використовують менше пам'яті.
title
вbody
індексацію, а потім індексувати, що дасть велику цінність, хоча я відкритий для виправлення. Я б, мабуть, просто дотримувався їх індексації окремо. Крім того, якщо це було якесь дурне одноразове, яке якимось чином вимагало від вас об'єднання, то, мабуть, ви могли просто запустити запит ad-hoc.