Полнотекстовый поиск в PostgreSQL за миллисекунды

Доклад принят в Программу конференции
Евгений Толмачев (На Авито каждый может найти что-то своё среди миллионов частных объявлений и предложений компаний. У нас десятки тысяч rps к бэкенду, терабайты картинок в хранилище и мощная система автоматизированной модерации на базе машинного обучения. Каждый месяц сервисом пользуется треть населения России.)Евгений Толмачев
Анастасия Быкова (СИБУР Диджитал – IT-кластер, который решает креативные задачи по цифровизации нефтегазохимии. Мы внедряем на производствах ИИ и другие технологии вроде интернета вещей, дополненной реальности, роботов и дронов, развиваем собственную платформу данных и инструменты для принятия data-driven решений.)Анастасия Быкова

Полнотекстовый поиск в СУБД PostgreSQL хорошо известен своими возможностями и расширяемостью. Однако можно выделить две основные причины, мешающие ему быть на одном уровне производительности со специализированными решениями:

  1. Будучи реализованы внутри СУБД, реализующей ACID, полнотекстовые индексы вынуждены поддерживать атомарность операций, конкурентные изменения, журналирование и т.д. Эта особенность неизбежна, если мы хотим получить интегрированное решение на базе реляционной СУБД, и является одновременно как преимуществом, так и недостатком.
  2. Полнотекстовые индексы используются только для фильтрации документов, ранжирование же требует извлечения самих документов из heap, что существенно снижает скорость обработки высокоселективных запросов. Этот недостаток не является неизбежным и может быть устранен путем включения дополнительной информации в GIN-индексы.
  3. При поиске GIN-индексы требуют полного сканирования соответствующих posting-lists и posting-trees и вызова для каждого элемента интерфейсной функции consistent. Этот недостаток может быть устранен путем введения оптимизатора поиска, что требует изменения интерфейса GIN.

В данном докладе будет представлен прототип патча к PostgreSQL, позволяющий:

  1. хранить позиционную информацию в полнотекстовом индексе. За счет этого ранжирование осуществляется исключительно по индексу без использования heap, что позволяет повысить скорость обработки высокоселективных запросов в десятки раз;
  2. оптимизировать использование GIN-индекса путем частичного сканирования posting-trees. Таким образом, решается проблема поисковых запросов вида "frequent_term & rare_term".

В докладе будет продемонстрирована работа прототипа на данных крупнейшей базы объявлений рунета avito.ru.