complex and composite search (geo + OR Attributes + Associations) How can I do that?

36 views
Skip to first unread message

deneuxa

unread,
Aug 4, 2012, 10:03:40 AM8/4/12
to thinkin...@googlegroups.com
I've post my question here:

Really need you help guys!
And thank you so much Pat for such a great gem !

Here my question too:
-------------------

I'd like to do a complex search with thinking sphinx:

Search for users which: 

-> live in a city (city_id attribute) 

-> or has hability to move to a city (mobile_cities association) 

-> or live at a maximum distance from a lat/long point, the maximum distance is different for each user and is set in a mobility_distance attribute.

For now I did that with 3 differents search, I volontary set a big per_page number, then i merge the 3 results on a single array, an then paginate this array :

#users living in the @city
search_set_living
= search_set.merge({:city_id => @city.id })
users_living
=  User.search :with => search_set_living.dup,
                               
:page => 1, :per_page => 1000

#users declaring hability to move to the @city
search_set_mobile
= search_set.merge({:mobile_cities_ids => @city.id })
users_mobile
=  User.search :with => search_set_mobile.dup,:page => 1, :per_page => 1000

#users living at a maximum distance from the origin point(custom distance for each user, max 30km)  
search_set_around
= search_set.merge({"@geodist" => 0.0..30_000.0})
users_around
=  User.search :geo => [@search_latitude * Math::PI / 180 , @search_longitude * Math::PI / 180],
                                 
:with => search_set_around.dup,
                                 
:page => 1, :per_page => 1000
users_around_filtered
= users_around.dup.delete_if{|user| (user.mobility_distance * 1000 )< user.sphinx_attributes['@geodist'] }


#merge the 3 results in a array
all_users
=  (users_mobile.flatten + users_around_filtered.flatten).uniq

#look for facets and paginate the array
@facets = User.facets :with => {:user_id => all_users.map(&:id)}
@users_to_display =  all_users.paginate(:page => params[:page], :per_page => 10)

This is working fine but i'm not satisfied: -performance are not so good, -I want the ability to sort on multiple attributes like this :order => "created_at DESC, @relevance DESC"

I want to do the exact same search but in a single sphinx's search. I know that I should use the "OR Logic with Attribute Filters" from the docs but I don't know how to mix it with a geo_search call... I really have no idea how to do that, can you guys help me ?

Many thanks,



Pat Allan

unread,
Aug 4, 2012, 10:51:10 AM8/4/12
to thinkin...@googlegroups.com
Answered on Stack Overflow. Let us know how you go.

Cheers

--
Pat

> --
> You received this message because you are subscribed to the Google Groups "Thinking Sphinx" group.
> To view this discussion on the web visit https://groups.google.com/d/msg/thinking-sphinx/-/Kk7PkpXm4nkJ.
> To post to this group, send email to thinkin...@googlegroups.com.
> To unsubscribe from this group, send email to thinking-sphi...@googlegroups.com.
> For more options, visit this group at http://groups.google.com/group/thinking-sphinx?hl=en.



alexis Deneux

unread,
Aug 5, 2012, 11:15:58 AM8/5/12
to thinkin...@googlegroups.com
Great ! Thank you so much, i get it worked :D


2012/8/4 Pat Allan <p...@freelancing-gods.com>
Reply all
Reply to author
Forward
0 new messages