Заметки о создании продвинутого поиска с PostgreSQL

PostgreSQL предоставляет встроенные возможности для создания собственного поискового движка для полнотекстового поиска.

В статье (ссылки на статьи ниже) автор использует набор данных с описаниями фильмов из базы Kaggle для демонстрации возможностей PostgreSQL.

Основные моменты, которые охватывает статья:

  • типы данных tsvector и tsquery
  • оператор соответствия @@
  • функции для ранжирования каждого совпадения (ts_rank, ts_rank_cd)
  • тип индекса GIN для эффективного запроса к tsvector.
  • построение поиска на стыке Postgres и Elasticsearch

Важно:

  • tsvector: тип данных, который хранит отсортированный список лексем. Лексема — это строка, которая была нормализована, чтобы разные формы одного и того же слова были одинаковыми. Например, нормализация почти всегда включает перевод букв верхнего регистра в нижний регистр и часто включает удаление суффиксов (например, s или ing в английском языке).
  • tsquery: тип данных, используемый для представления нормализованного запроса. В tsquery могут быть использованы операторы AND, OR, NOT, и FOLLOWED BY.
  • GIN: индекс, который делает поиск быстрым. GIN разработан для обработки случаев, когда элементы для индексации являются составными значениями, и запросы, обрабатываемые индексом, должны искать элементы, которые появляются в составных элементах.
  • ts_rank: функция для ранжирования результатов по релевантности.

Построение поиска на стыке Postgres и Elasticsearch

Синхронизация данные между PostgreSQL и Elasticsearch можно достигнуть при помощи расширения для PostgreSQL — https://pgsync.com.

Если функциональности полнотекстового поиска Postgres достаточна для вашего проекта, вы можете значительно упростить свою архитектуру и приложение, используя только Postgres.

Elasticsearch использует продвинутый алгоритм релевантности BM25, в то время как Postgres использует функции ранжирования ts_rank и ts_rank_cd.

В отношении производительности и масштабируемости, PostgreSQL и Elasticsearch имеют разные преимущества, в зависимости от размера набора данных и требований к поиску. Elasticsearch быстрее на больших наборах данных и при использовании сложных запросов.

Источники:
Часть 1 https://xata.io/blog/postgres-full-text-search-engine
Часть 2 https://xata.io/blog/postgres-full-text-search-postgres-vs-elasticsearch


Опубликовано

в

,

от

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *