Как стать автором
Обновить

Индексирование полнотекстовых данных в PostgreSQL с использованием модуля pg_trgm

Уровень сложностиПростой
Время на прочтение11 мин
Количество просмотров12K
Всего голосов 18: ↑16 и ↓2+19
Комментарии12

Комментарии 12

Совсем не ясно, как оператор LIMIT может "оптимизировать" поиск. Ну, допустим, мы ищем схожие данные с каким-то строковым значением. Для того, чтобы нам понять, на сколько строка близка к запрашиваемой, нам нужно строку сравнить. И вот первая строка на 0 похожа, вторая на 0.1, третья на 0.5, .... сто тридцать третья на 1, пятьсот восьмая на 0.99. И что нам даст LIMIT? Просто первые ЭН строк с отличным от нуля значением? И чем это будет полезно продукту в принципе? Ведь пользователь хочет получить максимально похожие строки, а не первые ЭН хоть как-то похожих.

Я вот давно думаю, с какого фига я не могу ничего и нигде толком найти (на том же алике или авито), а вот, оказывается, кто пилит им эти системы. Аффтор, убей себя апстену.

@moderator
меня хотят убить :(

CREATE INDEX trgm_document_idx ON documents USING gin (content gin_trgm_ops);

При изменении индексируемого поля индекс будет автоматически поддерживаться в актуальном состоянии, или его надо перестраивать?

Будет, но обновление индекса весьма тяжелая и дорогая операция. Причем для GIN и GIST индексов стоимость обновления и выборки, размер индекса очень разные и их надо обязательно иметь в виду. Глава 12.9 документации Postgres.

Возможно не прав, но pg_trgm не очень корректно называть полнотекстовым поиском. Все же триграммы про символы, а полнотекстовый поиск про фразы.

B-деревянные индексы: B-дерево

предлагаю пойти еще дальше и называть их С-Дерево ( сбалансированное то бишь дерево ). А то какое-то Бэ непонятное.

B-деревянные индексы

Ну вы хоть немного перевод вычитывайте перед тем, как запостить. Мне из-за вас любимый диван прожгло.

А почему в обзоре pg_trgm индексов нигде не написано, что и обычные like/ilike он очень даже весомо ускоряет? Я практически уверен, что в 99% случаев их используют именно для ускорения запросов с like/ilke.

И в контексте использования для ускорения с like'ми было бы интересно узнать про выбор типа индекса gin/gist - в каком случае какой больше подходит.

На самом деле да, ускоряет, у меня есть таблицы по 10+ лямов строк и индекс работает.

В сравнении и оптимизации ни одного explain не приложено. Это как сравнить тёплое с мягким получается.

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

Использовал этот gin индекс. Получал хороший результат на like запросы.

И также получил деградацию на запись.

Андрей Сальников из Data Egret в одном из докладов упоминал об этом недостатке.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий