sphinxsearchlogic icon indicating copy to clipboard operation
sphinxsearchlogic copied to clipboard

Sphinxsearchlogic is for ThinkingSphinx what Searchlogic is for ActiveRecord.. or at least something similar.

= Sphinxsearchlogic

Sphinxsearchlogic is for ThinkingSphinx what Searchlogic is for ActiveRecord.. or at least something similar.

== Helpful links

  • Github: http://github.com/joost/sphinxsearchlogic

Sphinxsearchlogic is largely based on / using:

  • Searchlogic: http://github.com/binarylogic/searchlogic/
  • ThinkingSphinx: http://freelancing-god.github.com/ts/en/
  • Sphinx: http://www.sphinxsearch.com/

If you're not familiar with ThinkingSphinx check {this presentation!}[http://www.slideshare.net/freelancing_god/solving-the-riddle-of-search-using-sphinx-with-rails-1406954]

== Install

First you need Sphinx and ThinkingSphinx. Simply because they rock. Check the ThinkingSphinx pages for this. Use the gem in your environment.rb like:

config.gem 'thinking-sphinx', :source => 'http://gemcutter.org'

Install as gem from Gemcutter.org (recommended).

sudo gem install sphinxsearchlogic -s http://gemcutter.org

Next use it in your environment.rb like:

config.gem 'sphinxsearchlogic', :source => 'http://gemcutter.org'

Install as plugin from Github.

./script/plugin install git://github.com/joost/sphinxsearchlogic.git

== Usage

Use Sphinxsearchlogic as you use the Searchlogic search method:

@search = Movie.sphinxsearchlogic(params[:search])

The search params you can pass:

Search:

:all => 'something' # search('something') :name => 'john' # search(:conditions => {:name => 'john'})

Filters:

:with_age => 20 # search(:with => {:age => 20}) :with_age => [21, 22] # search(:with => {:age => [21, 22]}) :with_age => 20..25 # search(:with => {:age => 20..25})

:without_age => 20 # search(:without => {:age => 20})

For MVAs you can also use:

:with_all_tags => [1,2,3] # search(:with_all => {:tags => [1,2,3]})

Thinking Sphinx scopes: :my_scope => true # my_scope (actually called with my_scope(true)) :some_scope => 'sweet' # some_scope(sweet)

=== Ordering

Ordering is implemented similar to Searchlogic.

:order => 'ascend_by_created_at' # :order => :attribute, :order => 'descend_by_created_at' # :order => :attribute, :sort_mode => :desc More advanced ordering? Use scopes! Like for {:order => 'rating DESC, votes DESC'} or {:sort_mode => :expr, :sort_by => '@weight * ranking'} :order => 'my_order_scope'

For your views see the order helper below.

=== Pagination

Unsimilar to Searchlogic Sphinxsearchlogic does pagination in the search. You can add them as follows since all arguments are merged.

@search = Movie.sphinxsearchlogic(params[:search], :page => params[:page], :per_page => params[:per_page])

If not specified default limits and pagination is used. As pagination is 'Always on' with ThinkingSphinx.

== Examples

=== Your controller

An example controller action:

class MovieController < ApplicationController def index @search = Movie.sphinxsearchlogic(params[:search], :page => params[:page], :per_page => params[:per_page]) @movies = @sphinxsearch.results end end

=== Your search forms

An example view search form:

<% sphinxsearchlogic_form_for @search do |form| %>

<%= form.label :all %> <%= form.text_field :all %>

<%= form.check_box :scary_movies, {}, '1', nil %> Only scary movies

<% end %>

The first field will send search[:all] params which will fulltext search through your data. The second is making use of a ThinkingSphinx scope (http://freelancing-god.github.com/ts/en/scopes.html) so it only works if you've defined it in your model.

=== Helpers

You can use a similar order helper as Searchlogic offers. You can order by attributes and fields (only if they are specified as sortable in your ThinkingSphinx index).

<%= order(@search, :by => :title, :as => 'Movie Title')

When you create two ThinkingSphinx scopes in your model you can even do special exotic ordering.

sphinx_scope(:ascend_by_rating_and_votes) { {:order => "rating ASC, votes ASC"} }

sphinx_scope(:descend_by_rating_and_votes) { {:order => "rating DESC, votes DESC"} }

You can also use this in the helper:

<%= order(@search, :by => :rating_and_votes, :as => 'Special ordering')

== TODO

Things that might be in next versions. Please contact me via Github if you've any suggestions or want to contribute.

=== Sanitize

Sanitize params so we don't f*ck with ThinkingSphinx.

=== Facets

Easy facets (http://freelancing-god.github.com/ts/en/facets.html) support.

=== Defaults

On the Model you want to search specify the defaults for the search. Eg. on the Movie model:

sphinxsearchlogic_default_order = 'descend_by_weight' sphinxsearchlogic_protected = :order, :per_page, :age, :name, :match_mode sphinxsearchlogic_max_per_page = 100 sphinxsearchlogic_match_mode = :any

Copyright (c) 2010 Joost Hietbrink, released under the MIT license