Полнотекстовый поиск в Heroku с использованием гема pg_search - PullRequest
5 голосов
/ 05 октября 2011

Я реализовал полнотекстовый поиск с использованием гема pg_search для моего приложения на Rails

Моя миграция для создания индекса выглядит как

execute(<<-'eosql'.strip)
  CREATE index mytable_fts_idx
  ON mytable
  USING gin(
    (setweight(to_tsvector('english', coalesce("mytable"."name", '')), 'A') ||
    ' ' ||
    setweight(to_tsvector('english', coalesce("mytable"."description",'')), 'B')
    )
  )
eosql

А код моего контроллера выглядит как

pg_search_scope :full_text_search,
:against => [
  :name, :description],
:using => {
  :tsearch => {
    :prefix => true,
    :dictionary => "english",
    :any_word => true
  }
}

, который прекрасно работает локально на Postgres 9.0.4.Однако, когда я развертываю то же самое в heroku и ищу пример запроса «test», он выдает ошибку

PGError: ERROR:  syntax error in tsquery: "' test ':*"

SELECT COUNT(count_column) FROM (SELECT  1 AS count_column FROM "mytable"  WHERE (((to_tsvector('english', coalesce("mytable"."name", '')) || to_tsvector('english', coalesce("mytable"."description", ''))) @@ (to_tsquery('english', ''' ' || 'test' || ' ''' || ':*')))) LIMIT 12 OFFSET 0) subquery_for_count ):

Любые предложения о том, где я ошибаюсь и что я должен искать, чтобы исправитьэта ошибка?Спасибо.

1 Ответ

13 голосов
/ 05 октября 2011

Я главный разработчик pg_search. Извините, что вы столкнулись с этой проблемой! Прямо сейчас существует ошибка pg_search при использовании поиска :prefix в PostgreSQL 8.3 (по умолчанию для Heroku).

https://github.com/Casecommons/pg_search/issues/10

Это мой главный приоритет прямо сейчас. Я все еще пытаюсь найти лучший способ заставить набор тестов работать как с 8.x, так и с 9.x.

Обновление : К сожалению, поиск :prefix вообще не работает с PostgreSQL 8.3. Функциональность была введена в 8.4. Я выпустил pg_search 0.3.3, который улучшает сообщение об ошибке. Надеюсь, Heroku скоро обновится до 9.0 по всем направлениям. Я полагаю, что они хотят сделать это, но они, очевидно, не могут просто модернизировать всех без предупреждения.

...