Полнотекстовый поиск по полю 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. Вы должны написать свой собственный триггер, а не использовать предоставленный общий.

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