Hi, I have i am trying to add a search feature to a ruby on rails blog, so ive decided to use ferret. So far i have had quite a few problems with it, from following a few tutorials i didnt really understand... i am at the point where i can make a search and it returns the score of the result. I want it to also show the title of the post and i think i have implemented it correctly but it doesn''t. This is the code in my search.rhtml: <% @results.each_with_index do |result, index| %> <%= result[:title] %> Score: <%= result[:score] %><br/><br/> <% end %> And this is the controller: def search @query = params[:q] @total, @results = Post.find_storage_by_contents(@query, :page => (params[:page]||1)) @pages = pages_for(@total) end This is the code from post.rb: def self.find_storage_by_contents(query, options = {}) # Get the index that acts_as_ferret created for us index = self.aaf_index.ferret_index results = [] # search_each is the core search function from Ferret, which Acts_as_ferret hides total_hits = index.search_each(query, options) do |doc, score| result = {} # Store each field in a hash which we can reference in our views result[:title] = index[doc][:title] # We can even put the score in the hash, nice! result[:score] = score results.push result end return block_given? ? total_hits : [total_hits, results] end there is probably something i have missed before this is able to work, if u have any ideas please help! thanks, Will -- Posted via http://www.ruby-forum.com/.
Hi! Why do you try doing this the hard way? There''s really no reason to use Ferret directly for a blog search once you have acts_as_ferret in your Rails app. Here''s the simplest possible example: Model: class Post acts_as_ferret :fields => { :title => {}, :content => {} } end Controller: def search @results = Post.find_by_contents(query) end View: <ul> <% @results.each do |result| %> <li><%= result.title %><br /> Score: <%= result.ferret_score %> </li> <% end %> </ul> For implementing paging across your result set, please check out http://www.railsenvy.com/2007/2/19/acts-as-ferret-tutorial#pagination Regarding your initial problem with missing titles - acts_as_ferret by default stores no attributes but the id of your records in the ferret index, to keep index size small. To get around this specify :store => :yes in the field options for your title field: acts_as_ferret :fields => { :title => { :store => :yes }, :content => {} } However as I said above, just go the easy way... Jens On Tue, Jul 03, 2007 at 02:29:15PM +0200, William Monk wrote:> Hi, > > I have i am trying to add a search feature to a ruby on rails blog, so > ive decided to use ferret. So far i have had quite a few problems with > it, from following a few tutorials i didnt really understand... i am at > the point where i can make a search and it returns the score of the > result. I want it to also show the title of the post and i think i have > implemented it correctly but it doesn''t. > > This is the code in my search.rhtml: > > <% @results.each_with_index do |result, index| %> > <%= result[:title] %> > Score: <%= result[:score] %><br/><br/> > <% end %> > > And this is the controller: > > def search > @query = params[:q] > @total, @results = Post.find_storage_by_contents(@query, :page => > (params[:page]||1)) > @pages = pages_for(@total) > end > > This is the code from post.rb: > > def self.find_storage_by_contents(query, options = {}) > # Get the index that acts_as_ferret created for us > index = self.aaf_index.ferret_index > results = [] > > # search_each is the core search function from Ferret, which > Acts_as_ferret hides > total_hits = index.search_each(query, options) do |doc, score| > result = {} > > # Store each field in a hash which we can reference in our views > result[:title] = index[doc][:title] > > > # We can even put the score in the hash, nice! > result[:score] = score > > results.push result > end > return block_given? ? total_hits : [total_hits, results] > end > > there is probably something i have missed before this is able to work, > if u have any ideas please help! thanks, Will > > -- > Posted via http://www.ruby-forum.com/. > _______________________________________________ > Ferret-talk mailing list > Ferret-talk at rubyforge.org > http://rubyforge.org/mailman/listinfo/ferret-talk >-- Jens Kr?mer webit! Gesellschaft f?r neue Medien mbH Schnorrstra?e 76 | 01069 Dresden Telefon +49 351 46766-0 | Telefax +49 351 46766-66 kraemer at webit.de | www.webit.de Amtsgericht Dresden | HRB 15422 GF Sven Haubold, Hagen Malessa
Hi, Thanks for your really fast reply. I am quite new to rails and couldnt find anything which was pointing me in the right direction apart froms some complicated tutorials. I have done what you have said, but i am not sure what the form should look like to give results, this is what i am using at the moment, plus everything you told me: <div id="search"> <% form_tag({:action => :search}, :method => ''get'') do %> <%= text_field_tag :query, params[:query] %><%= submit_tag ''Search'', :id => ''hide''%> <% end %></div> but i get an error: TypeError in BlogController#search wrong argument type Symbol (expected Data) im not sure if this is to do with the posts being indexed incorectly, but if you could help again that would be great! Thanks Will -- Posted via http://www.ruby-forum.com/.
On Tue, Jul 03, 2007 at 04:12:09PM +0200, William Monk wrote:> > Hi, > > Thanks for your really fast reply. I am quite new to rails and couldnt > find anything which was pointing me in the right direction apart froms > some complicated tutorials. I have done what you have said, but i am not > sure what the form should look like to give results, this is what i am > using at the moment, plus everything you told me: > > > <div id="search"> > <% form_tag({:action => :search}, :method => ''get'') do %> > <%= text_field_tag :query, params[:query] %><%= submit_tag > ''Search'', :id => ''hide''%> > <% end %></div> > > > but i get an error: > > TypeError in BlogController#search > > wrong argument type Symbol (expected Data) > > im not sure if this is to do with the posts being indexed incorectly, > but if you could help again that would be great! Thanks WillI had a small typo in the controller, it should read find_by_contents(params[:query]) Jens -- Jens Kr?mer webit! Gesellschaft f?r neue Medien mbH Schnorrstra?e 76 | 01069 Dresden Telefon +49 351 46766-0 | Telefax +49 351 46766-66 kraemer at webit.de | www.webit.de Amtsgericht Dresden | HRB 15422 GF Sven Haubold, Hagen Malessa
Jens Kraemer wrote:> I had a small typo in the controller, it should read > > find_by_contents(params[:query])Thanks a lot Jens, you have been a massive help for getting search to work, and now it works perfectly. Thanks! Will -- Posted via http://www.ruby-forum.com/.