Rails: Как мне искать теги, сгенерированные Act_As_Taggable_On, с помощью PG_Search? (постгрескл)

В настоящее время я использую Act_as_taggable_on для тегирования и pg_search для поиска в моей базе данных postgresql в моем приложении Rails 3.

Как мне выполнять поиск по тегам, сгенерированным драгоценным камнем act_as_taggable_on, с помощью pg_search? Я могу просмотреть теги сообщения, сказав «Post.find(1).tag_list», но в таблице сообщений нет столбцов «тегов», поэтому, когда я запускаю

 pg_search_scope :search_by_weight, :against => {:tag_list => 'A', :title => 'B', :content => 'C'} #,:using => [:tsearch => {:prefix => true}] #:trigram, :dmetaphone]

это дает мне ошибку, потому что столбец Post.tag_list не существует в таблице сообщений. Как это называется, когда вы можете найти значение через точечный соединитель (т.е. Mission.tag_list), но когда его нет в таблице? Я не знал, что печатать. Итак, как мне передать несуществующий столбец в качестве параметров?

Кроме того, вы, возможно, заметили, что я закомментировал

 :using => [:tsearch => {:prefix => true}] #:trigram, :dmetaphone]

над. Я не могу найти, как установить дополнительные модули для Postgresql. Где мне ввести CREATE EXTENSION? (с использованием Ubuntu 11.10 и postgresql 9.1.3 -> и heroku для производства)


person kibaekr    schedule 19.05.2012    source источник
comment
@muistooshort есть идеи, как это решить?   -  person kibaekr    schedule 20.05.2012


Ответы (3)


Гораздо более простой подход — просто использовать ассоциацию и выполнить поиск через pg_search, который делается следующим образом:

class Item < ActiveRecord::Base
 include PgSearch  

  pg_search_scope :full_search, 
    :against => {  
    :item_status => 'A',
    :title => 'B',
    :description => 'C'    
   },       
    :associated_against => {
    :tags => [:name]    
   }
end 

Я только что реализовал это в одном из своих проектов, и он работал хорошо (поиск по именам тегов). К сожалению, я не могу понять, как взвесить связанную связь, поскольку в ней указано, что столбец «теги» не найден в таблице «Элементы».

person user783437    schedule 24.05.2012
comment
Спасибо за ответ! Да, я действительно понял это до сих пор, но у меня была такая же проблема с взвешиванием тегов. Удалось ли вам заставить работать дополнительные функции поиска (например, триграмму)? (Вы используете Heroku?) - person kibaekr; 25.05.2012
comment
Привет, я не пробовал добавлять какие-либо другие дополнительные функции поиска, только функцию ассоциации. Я использую Heroku, и, к сожалению, гем pg_search сейчас у меня не работает, но я работаю над ним. Предположительно, pg_search легко использовать с Heroku, в отличие от некоторых других полнотекстовых поисковых систем, поэтому я думаю, что это будет легко исправить. Тем не менее было бы здорово, если бы теги могли быть взвешены или если бы теги могли быть выполнены с точным соответствием, иначе какова цель тегов? - person user783437; 27.05.2012
comment
Понимаю. Да, я думаю, что у меня есть дополнительные функции для локальной работы, но я не думаю, что они работают на Heroku прямо сейчас. (Я думаю, это может быть из-за того, что мне нужно обновить или установить пакеты contrib на сервере, но heroku не позволит мне получить доступ к обновлению и установке базы данных pg) - person kibaekr; 27.05.2012
comment
Думаю, мне просто нужно довольствоваться тем, что это не дает мне ошибки. - person kibaekr; 27.05.2012
comment
Есть идеи, как бы я упорядочил результаты поиска по карме (голосам)? Я избавился от весов и сделал: @missions = Mission.search_by_weight(params[:query]).order(karma desc).page(params[:page]).per(12) // но все равно перечисляет релевантность (вес) - person kibaekr; 27.05.2012
comment
Для веса на теге попробуйте использовать tags: { name: 'A' } или «B», «C», «D». - person Kesha Antonov; 04.11.2015

Это сработало для меня, чтобы взвесить теги.

    pg_search_scope :search_by_weight, 
      :against => {  
      :title => 'B',
      :content => 'C'    
    },       
    :associated_against => {
      :tags => { :name => 'A' }    
    },
    using: {tsearch: {dictionary: "english"}}
person triendeau    schedule 30.08.2014

Я написал свою реализацию на plpgsql несколько лет назад. См. мой блог: http://omarqureshi.net/articles/2010-12-25-tsearch2-for-rails-applications, в котором рассказывается, как заставить его работать.

person Omar Qureshi    schedule 19.05.2012
comment
Хм ... как новичок, все еще очень сложно понять, что вы делаете в своем блоге, и применить это к моей ситуации. - person kibaekr; 22.05.2012
comment
Я бы начал с чтения руководства по plpgsql и документации по триггерам для postgres. - person Omar Qureshi; 22.05.2012
comment
Это решение! Очень хороший пост Омар, правда некоторые функции немного усложнены и я их немного подчистил. Тем не менее, я бы никогда не сделал это без вашего сообщения в блоге. Я бы проголосовал за вас на 10 баллов, если бы мог :) ура - person ; 28.02.2013