Многостолбцовый индекс для совпадения строк + сходство строк с pg_trgm?
Дайте эту таблицу:
foos
integer id
string name
string type
И такой запрос:
select * from foos where name ilike '%bar%'
Я могу сделать такой индекс pg_trgm, чтобы сделать поиск быстрее:
CREATE INDEX ON foos USING gin (name gin_trgm_ops)
(право?)
мой вопрос: как насчет запроса, как это:
select * from foos where name ilike '%bar%' AND type = 'baz'
Могу ли я сделать индекс, который поможет поиск обоих столбцов?
(Я знаю, что триграмма не является строго полнотекстовой, но я все равно отмечаю этот вопрос как таковой)
2 ответа
Вы можете использовать многоколонный индекс, объединяющий разные типы.
Сначала добавьте два расширения, необходимые в вашем случае:
CREATE EXTENSION pg_trgm;
CREATE EXTENSION btree_gist;
pg_trgm позволяет использовать индексы триграмм, а btree_gist позволяет комбинировать gist
а также b-tree
индексы, чего ты хочешь!
Для запроса типа:
SELECT * FROM foo WHERE type = 'baz' AND name ilike '%bar%';
Теперь вы можете создать индекс как:
CREATE INDEX ON foo USING gist (type, name gist_trgm_ops);
Как обычно, порядок столбцов должен быть одинаковым между запросом и индексом.
Используйте составной индекс:
CREATE INDEX ON foos(name, type)
Тем не менее, вы можете захотеть:
CREATE INDEX ON foos(lower(name), type)
Я не понимаю, почему для ваших запросов нужен полнотекстовый индекс.