Камень в огород полнотекстового поиска в PostgreSQL

PostgreSQLНа днях на работе решали вопрос о том, какой инструмент использовать для полнотекстового поиска информации. Рассматривалось много вариантов, среди которых был встроенный с версии 8.3 поиск в PostrgeSQL. К сожалению, одной маленькой мелочи не хватило в нем, чтобы мы могли его использовать. Очень горькая ложка дегтя в большой бочке меда.

Для начала отмечу, что полнотекстовый поиск в довольно мощный, по возможностям превосходящий поиск в MySQL. Многие программисты переводили проекты на постгри только из-за этого поиска.

Маленькая ложка дегтя заключается в том, что нет в полнотекстовом поиске в Postgres поиска по фразам. Мы прошуршали весь мануал по поиску, ну нету синтаксиса для запроса поиска по фразе. Я зашел на #postgres@irc.freenode.org. И там совета не дали. Спросил на известном форуме. Эффект ноль. Только один человек посоветовал пути обхода этого момента, но они такие геморройные, что не считаю нужным их тут описывать.

Похоже, что эту опцию они собираются внедрить только в будущих версиях поискового движка. http://www.sai.msu.su/~megera/wiki/todo «todo: …phrase search through new operator or adding word ordering in tsquery…»

В общем, нет в PostgreSQL 8.3 полнотекстового поиска по фразам.

Об авторе Валера Леонтьев

Программист PHP/MySQL.

Запись опубликована в рубрике IT, Web, Все рубрики с метками . Добавьте в закладки постоянную ссылку.

Один комментарий на «Камень в огород полнотекстового поиска в PostgreSQL»

  1. iz говорит:

    дклаб не лучшее место для вопросов о постгресе :)

    В PostgreSQL если очень хочется поиск по фразам можно сделать так. Делается обычный запрос, который возвращает больше рез-тов, чем вам нужно, используя полнотекстовый индекс. Далее рез-ты запроса анализируются на предмет расстояния между словами — хотя бы даже LIKE-ом или регекспами, используя нормальные формы слов (то есть морфология уже учтена). То есть хотя бы даже так:

    WHERE tsvector_column @@ plainto_tsquery(‘супер погода’) and tsvector_column::text LIKE ‘%’ || plainto_tsvector(‘супер погода’)::text || ‘%’

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