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
Добавить комментарий