получение ключей из индекса GIN в столбце tsvector в Postgres 9.1

У меня есть набор документов, по которым я хотел бы выполнить полнотекстовый поиск в Postgres 9.1, поэтому добавление их в качестве содержимого tsvector и последующее создание индекса GIN для этого столбца кажется достаточно простым. Насколько я понимаю, индекс GIN состоит в том, что используемые ключи (в зависимости от используемой конфигурации текстового поиска) представляют собой либо список исходных слов, либо их нормализованные лексемы из коллекции исходных документов. Однако для других функций, которые мы разработали, я бы действительно хотел получить этот список ключей из индекса GIN, чтобы поместить его в другой столбец в другой таблице для использования. Это возможно?

Изменить: я повторно разместил это на pql- общий список рассылки.


person Chris Esposito    schedule 18.10.2012    source источник


Ответы (1)


Я предполагаю, что вы создали индекс выражения согласно документации, например:

CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector('english', body));

Если это так, насколько я знаю, вы не можете напрямую извлекать значения из индекса, например:

SELECT to_tsvector('english', body) FROM pgweb;

похоже, не может использовать индекс даже при принудительном (только для тестирования) с set enable_seqscan = off. Возможно, это может работать в PostgreSQL 9.2 при сканировании только по индексу; Я еще не обновил свою машину, поэтому не могу сказать.

Вы можете использовать индекс для ускорения выполнения других запросов, JOIN обрабатывая таблицу с индексированными данными и используя тот же индекс выражения.

Если вы собираетесь использовать tsvector для чего-то еще, я бы предложил изменить ваш подход. Добавьте в таблицу новый столбец типа tsvector. Используйте триггер BEFORE INSERT OR UPDATE OR DELETE ... FOR EACH ROW, чтобы автоматически поддерживать tsvector столбец в актуальном состоянии с индексируемым столбцом. Затем создайте свой индекс GIN в новом столбце tsvector. Таким образом, вы можете напрямую запрашивать столбец, а не использовать его только как индекс выражения. Если вы прочтете ниже раздел «Создание индексов», на который я уже ссылался выше, вы увидите объяснение, как это сделать, и как использовать триггер для автоматического обновления столбца tsvector.

person Craig Ringer    schedule 18.10.2012