Главная » Хабрахабр » Что нового в PostgreSQL 11: встроенный веб-поиск

Что нового в PostgreSQL 11: встроенный веб-поиск

Соответствующий патч разработали Виктор Дробный и Дмитрий Иванов, с правками от Федора Сигаева. Продолжая тему интересных возможностей грядущего релиза PostgreSQL 11, я хотел бы рассказать про новую встроенную функцию websearch_to_tsquery. Давайте же разберемся, что реализовано в этом патче.

Что тут еще можно было добавить? Казалось бы, полнотекстовый поиск есть в PostgreSQL уже давно, и он очень даже неплохо работает.

Вот вам прилетела форма с поисковым запросом. Представьте, что вы делаете интернет-магазин на базе PostgreSQL и вам нужен поиск по товарам. Можно сделать это с помощью функции to_tsquery. Для поиска по базе из этого запроса нужно как-то построить tsvector. Но to_tsquery ожидает, что строка будет в определенном формате:

=# select to_tsquery('foo bar baz');
ERROR: syntax error in tsquery: "foo bar baz"

=# select to_tsquery('foo & bar & baz');
to_tsquery
-----------------------
'foo' & 'bar' & 'baz'

Неудобно. Другими словами, в этом случае придется написать функцию, преобразующую запрос пользователя в запрос, понятный to_tsquery. Отчасти эту проблему решают функции plainto_tsquery и phraseto_tsquery:

=# select plainto_tsquery('foo bar baz');
plainto_tsquery
-----------------------
'foo' & 'bar' & 'baz'

=# select phraseto_tsquery('foo bar baz');
phraseto_tsquery
---------------------------
'foo' <-> 'bar' <-> 'baz'

Дело в том, что пользователь может интуитивно воспользоваться кавычками или, скажем, какими-то булевыми операторами, потому что это работает у Google, Яндекса и других поисковых систем. Но с ними есть проблема. Давайте посмотрим, что произойдет в этом случае:

=# select plainto_tsquery('"foo bar" -baz or qux');
plainto_tsquery
-------------------------------
'foo' & 'bar' & 'baz' & 'qux'

Ой. Все сломалось! Неужели все-таки придется писать свой парсер?

Вот чтобы его не приходилось писать с нуля для каждого приложения, начиная с PostgreSQL 11 соответствующий парсер теперь будет прямо в СУБД:

=# select websearch_to_tsquery('"foo bar" -baz or qux');
websearch_to_tsquery
----------------------------------
'foo' <-> 'bar' & !'baz' | 'qux'

То есть, вы никогда не получите ошибку, на выходе всегда будет какой-то tsquery: Помимо того, что websearch_to_tsquery понимает кавычки, знак минус и булевы операторы, он интересен тем, что игнорирует любые попытки сделать синтаксическую ошибку.

=# select websearch_to_tsquery('-"foo bar" ((( baz or or qux !@#$%^&*_+-=');
websearch_to_tsquery
--------------------------------------
!( 'foo' <-> 'bar' ) & 'baz' | 'qux'

То есть, вот так не прокатит: Еще из особенностей функции следует отметить тот факт, что она игнорирует любые скобки.

=# select websearch_to_tsquery('foo and (bar or baz)');
websearch_to_tsquery
-----------------------
'foo' & 'bar' | 'baz'

Просто игнорируя их, мы существенно упрощаем реализацию фичи «сделать так, чтобы функция никогда не завершалась с ошибкой», да и разбор запроса будет работать быстрее. Данное поведение было выбрано из соображений, что нормальные люди (не айтишники :trollface:) на практике скобочки все равно не используют. Возможно, флаг, включающий поддержку скобочек, появится в будущих версиях.

Как минимум, она делает полнотекстовый поиск в PostgreSQL не хуже, чем он был до этого, и позволяет разработчикам упростить код своих приложений. Такая вот несложная, но полезная функция.


Оставить комментарий

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

*

x

Ещё Hi-Tech Интересное!

[Перевод] Почему процессоры Skylake иногда работают в 2 раза медленнее

Мне сообщили, что на новых компьютерах некоторые регрессиионные тесты стали медленнее. Обычное дело, такое бывает. Неправильная конфигурация где-то в Windows или не самые оптимальные значения в BIOS. Но в этот раз нам никак не удавалось найти ту самую «сбитую» настройку. ...

«Защита авторских прав в ЕС»: новая реформа может повлиять не только на медиаплатформы

Новая директива о защите авторских прав, предложенная в Евросоюзе, которую мы недавно обсуждали в блоге, может существенно повлиять на устройство таких платформ, как YouTube, Facebook и Pinterest. Однако «под ударом» оказались не только они, но и библиотеки и агрегаторы научных ...