👩💻👩💻 Реализация поиска семантически похожих текстов (или товаров) на Go и Postgres (pgVector)
Казалось бы, в Postgres и так есть неплохой полнотекстовый поиск (tsvector/tsquery), и вы из коробки можете проиндексировать тексты, а потом поискать по ним.
Но на самом деле это не совсем то, что нужно — такой поиск работает лишь по чётким совпадениям слов. То есть Postgres не догадается, что «кошка гонится за мышью» — это довольно близко к «котёнок охотится на грызуна». Антон Околелов, Go-тимлид в компании Karuna, делится кейсом решения этой проблемы:
✔️ Преобразовываем тексты в наборы чисел (векторы)
✔️ Сохраняем векторы в базе с помощью pgvector
✔️ Легко ищем близкие друг к другу векторы или ищем их по вектору-запросу
✔️ Ускоряем индексами
Казалось бы, в Postgres и так есть неплохой полнотекстовый поиск (tsvector/tsquery), и вы из коробки можете проиндексировать тексты, а потом поискать по ним.
Но на самом деле это не совсем то, что нужно — такой поиск работает лишь по чётким совпадениям слов. То есть Postgres не догадается, что «кошка гонится за мышью» — это довольно близко к «котёнок охотится на грызуна». Антон Околелов, Go-тимлид в компании Karuna, делится кейсом решения этой проблемы:
✔️ Преобразовываем тексты в наборы чисел (векторы)
✔️ Сохраняем векторы в базе с помощью pgvector
✔️ Легко ищем близкие друг к другу векторы или ищем их по вектору-запросу
✔️ Ускоряем индексами