Полнотекстовый поиск по полю hstore по индексу
Можно ли сделать полнотекстовый поиск по столбцу hstore, который использует индекс джина?
У меня есть столбец hstore "data" и индекс, такой как документы:
CREATE INDEX hidx ON testhstore USING GIN (data);
И, насколько я могу найти способ сделать запрос, это привести с avals к столбцу hstore:
CAST(avals(data) AS text) @@ 'something'
Тем не менее, запрос объяснения выполняет только сканирование и не выполняет поиск по индексу, занимая несколько секунд для таблицы, содержащей менее 100 тыс. Записей.
1 ответ
Да, вы можете создать полнотекстовый индекс для любого выражения, а не только для столбца.
например:
CREATE INDEX someindex ON sometable USING gin(to_tsvector('english', CAST(avals(data) AS text)));
Я рекомендую оборачивать такие выражения в простые функции SQL, например:
CREATE OR REPLACE FUNCTION hstore_vals_text(hstore)
RETURNS text LANGUAGE sql IMMUTABLE AS $$
SELECT CAST(avals($1) AS text);
$$;
CREATE INDEX someindex ON sometable USING gin(to_tsvector('english', hstore_vals_text(data)));
SELECT ... FROM ... WHERE hstore_vals_text(data) @@ to_tsquery('something');
Это помогает синтаксическому анализатору сопоставить индекс с выражением, так как не очень понятно, какие индексы соответствуют каким выражениям.
Для лучшей производительности (за счет некоторого потраченного впустую пространства хранения) вы можете дублировать данные в столбце с поддержкой триггера, содержащем tsvector
и индексировать это; см. документацию по tsearch2. Вы должны написать свой собственный триггер, а не использовать предоставленный общий.