Good to know there's been some progress.

I highly recommend your search actions are accessible via GET - you're not 
modifying or removing data, so from a RESTful perspective, GET is the right 
method. This also makes the AJAX/pagination side of things much cleaner.

For grouping results by class, you have a couple of options. You can sort by 
class_crc, which is an encoding of the model name used by Thinking Sphinx:

  Model.search :order => :class_crc

Or an alternative would be to specify a unique order attribute for each model 
as an attribute:

  has "1", :as => :class_order, :type => :integer

And then sort by that:

  Model.search :order => :class_order

You'll probably want to make it a bit smarter, sorting by class and then 
relevance:

  Model.search :order => "@weight DESC, @class_order ASC"

Cheers

-- 
Pat

On 11/12/2009, at 4:44 AM, plcs wrote:

> Hi Pat,
> 
> Thank you for the quick reply!
> 
> On your advice I've implemented a search controller/helper and have
> two methods to check the case against the models I have and return
> accordingly.
> 
> Presently I am using Ajax for my search, and am able to display many
> results extremely quickly.
> 
> However I still cannot paginate through these due to my routes
> complaining search is post only.
> 
> My problem is that regardless of if it is using Ajax or not, when I
> display my results it is because of a call to the search controller
> search choice, and this needs to be a post for it to work. (Or at
> least I believe so).
> 
> search_helper.rb
> def find_link(result)
>    case result
>    when User
>      user_path(result)
>    end
> end
> 
> search_controller.rb
>  def search
>    session[:query] = params[:query].strip if params[:query]
>    if session[:query] and request.xhr?
>      @search = ThinkingSphinx.search session[:query],
>        :star => true,
>        :max_matches => 1000,
>        :per_page    => 1000
>      render :partial => "results",
>        :layout => false,
>        :locals => {:results => @search}
>    end
>  end
> 
> index.html.erb
> <div>
>  <%= text_field_tag("query", params[:query], :autocomplete => "off" )
> %>
>  <%= observe_field 'query',
>    :frequency => 2,
>    :update => "results",
>    :url => {:controller => "search", :action => "search"},
>    :with => "query" %>
> </div>
> <div id="results"></div>
> 
> _results.html.erb
> <% if results.length == 0 %>
>  <p>Sorry, nothing matched your search query...</p>
> <% elsif params[:query] == "" %>
>  <p>Please enter text into the text field to start the query</p>
> <% else %>
>  <% paginated_section results do %>
>  <ul>
>    <% for result in results %>
>      <li><%= link_to find_name(result), find_link(result) %></li>
>    <% end %>
>  </ul>
>  <% end %>
> <% end %>
> 
> routes.rb
>  # we only require search for the ajax search interface
>  map.search '/search', :controller => 'search', :action => 'index'
>  map.resources :search, :only => [ :index ], :collection => { :search
> => :post }
> 
> Really I want to be able to paginate through the results and not have
> to display a large amount in the ajax view, but I can't currently see
> a better way. I'd be happy to have separate pages for searching and
> returns, but my previous solution wouldn't work because of the post
> request problem.
> 
> I know this is less related to thinking-sphinx than a general problem,
> but if you know of a better way I'd be grateful.
> 
> On a thinking-sphinx related problem, is there a way to group by the
> model?
> 
> Thanks
> 
> plcs
> 
> On Dec 10, 4:39 am, Pat Allan <[email protected]> wrote:
>> Hi there
>> 
>> If you're after search results, not a search breakdown by category, then 
>> facets isn't the best tool for the job. You should just be able to search 
>> across all models:
>> 
>>   ThinkingSphinx.search @query, :star => true
>> 
>> As for dealing with different objects, I'd recommend writing a view helper 
>> to determine where to send links. Of course, if all objects have a name (or 
>> whatever you want the link text to be), and have matching 
>> controllers/resources set up, then you could just loop through like so:
>> 
>>   <%- @results.each do |result| -%>
>>     <li><%= link_to result.name, result %></li>
>>   <%- end -%>
>> 
>> And Rails will figure out the rest. This isn't particularly flexible though.
>> 
>> As for getting *all* results, there is an inherent limit for Sphinx and how 
>> it works, but you can work around it to some extent (essentially, you can't 
>> turn pagination off, but you can request really big 
>> pages):http://freelancing-god.github.com/ts/en/advanced_config.html#large-re...
>> 
>> --
>> Pat
>> 
>> On 09/12/2009, at 10:51 PM, plcs wrote:
>> 
>> 
>> 
>>> Hi,
>> 
>>> I've been banging my head against the nearest wall trying to find the
>>> best way to create links from the results I get back from searching
>>> across all my models. Essentially I want it so that there is a single
>>> search controller that will search all my existing models and return
>>> the results of the search, with links to the page in question.
>> 
>>> So is facet's the way to go, or should I be using the normal Search?
>> 
>>> Below is how I perform the facet search, and it works fine, my trouble
>>> is handling the output it gives me.
>> 
>>> def search
>>>    @query = params[:query]
>>>    @facets = ThinkingSphinx.facets @query, :all_facets => true,
>>>      :star => true
>>>    respond_to do |format|
>>>      format.html
>>>      format.xml { render :xml => @facets }
>>>    end
>>> end
>> 
>>> <div class="search">
>>>  <% @facets.each do |facet, facet_options| %>
>>>    <% unless facet_options.blank? %>
>>>      <h5><%= facet %></h5>
>>>      <ul>
>>>      <% facet_options.each do |option, count| %>
>>>        <li><%= link_to "#{option} (#{count})",
>>>          :params => {facet => option, :page => 1} %></li>
>>>      <% end %>
>>>      </ul>
>>>    <% end %>
>>>  <% end %>
>>> </div>
>> 
>>> Basically I don't want the situation where I have to check the
>>> instance of the option to decide what path from routes to give it, I'd
>>> really prefer it if there was a general method that'll find this for
>>> me.
>> 
>>> Should I really be using facets here, or normal search?
>> 
>>> And as a side note, is there anyway to get ALL results from search?
>>> Not just the first 10?
>> 
>>> Thank you for your help.
>> 
>>> plcs
>> 
>>> --
>> 
>>> You received this message because you are subscribed to the Google Groups 
>>> "Thinking Sphinx" group.
>>> To post to this group, send email to [email protected].
>>> To unsubscribe from this group, send email to 
>>> [email protected].
>>> For more options, visit this group 
>>> athttp://groups.google.com/group/thinking-sphinx?hl=en.
> 
> --
> 
> You received this message because you are subscribed to the Google Groups 
> "Thinking Sphinx" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to 
> [email protected].
> For more options, visit this group at 
> http://groups.google.com/group/thinking-sphinx?hl=en.
> 
> 

--

You received this message because you are subscribed to the Google Groups 
"Thinking Sphinx" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/thinking-sphinx?hl=en.


Reply via email to