В последние несколько дней я сталкивался с полнотекстовым поиском в postgres, и меня немного смущает индексация при поиске по нескольким столбцам.
В 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.