Многостолбцовый индекс для совпадения строк + сходство строк с 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)

Я не понимаю, почему для ваших запросов нужен полнотекстовый индекс.

Другие вопросы по тегам