Не удалось получить отрывок из Postgres с помощью драгоценного камня pg_search

Обновить

Во-первых, нет метода "контекст". Это было слово, которое мой мозг придумал в какой-то момент и закрепил за ним. Очевидно, я должен был запустить .excerpt(). Во-вторых, я запускал команду для возвращаемого массива, а не для отдельного экземпляра PG_Search::Document.

Двойные ошибки, но да, код действительно работает.

Завершить обновление

Сначала немного информации о системе:

  • Рубин 1.9.3p194
  • Рельсы 3.2.13
  • pg_search 0.5.7
  • Postgres 9.2.3 (с включенным безакцентом)

Я пытаюсь следить за прогрессом, достигнутым в этой теме: (Как показать выдержки из результатов мультипоиска pg-search)

Хорошо, если предположить, что используется следующий запрос, взятый из этого поста:

@query = params[:query]
PgSearch.multisearch(@query).select("ts_headline(pg_search_documents.content, plainto_tsquery('english', ''' ' || unaccent('#{@query}') || ' ''' || ':*')) AS excerpt")

возвращает:

=> [#<PgSearch::Document id: 7, content: "1 <p>You think water moves fast? You should see ice...", searchable_id: 2, searchable_type: "Release", created_at: "2013-03-27 18:58:52", updated_at: "2013-03-27 18:58:52">]

Он успешно возвращает некоторые результаты поиска, но в них вообще нет метода context. Как будто я только что вызвал multisearch без метода select.

Я новичок в SQL и Postgres, поэтому я не совсем уверен, с чего начать отладку этого фрагмента. Я хотел бы получить помощь в отладке или получить объяснение того, что происходит.

Кроме того, я считаю важным отступление: я хочу поблагодарить всех, кто работает над pg_search или отвечает на подобные вопросы. Вы делаете мир лучше.


person Jake    schedule 27.03.2013    source источник
comment
Интересно, как вы решили это   -  person The Whiz of Oz    schedule 15.07.2016


Ответы (1)


Вы также должны выбрать другие столбцы, которые вам нужны.

Например

sanitized = ActionController::Base.helpers.sanitize(params[:q])
@results = PgSearch.multisearch(params[:q])
                  .select(:id, :content, :searchable_id, :searchable_type)
                  .select(["ts_headline(pg_search_documents.content, plainto_tsquery('english', ''' ' || '#{sanitized}' || ' ''' || ':*')) AS excerpt"])

Возвращает идентификатор, содержимое, searchable_id, searchable_type, выдержку

Также обратите внимание на дезинфекцию. Не хочу страдать от атаки SQL-инъекций. :]

person bfcoder    schedule 19.08.2015