Hi Pat,

Thanks for your reply. What I've done is to define the index on the
model that provides the :through association, so in my case Campaign.
So, now when I perform a search with a location and keywords from the
Promotion, I get returned the Campaigns that match. As a Campaign
uniquely identifies one Promotion and one Site, I can walk the objects
and show the relevant Promotion/Site information. This is a big step
forward.

What I was hoping was that I could then group_by the
Campaign.promotion_id, so that if my search returned the same
Promotion but at more than 1 site, the group_by would eliminate the
duplicates. However, when I apply the group_by to my search I get no
rows returned from the search at all.

I've taken a look at the Sphinx docs for group_by, and I think I've
understood the purpose of the :attr group function, but still can't
understand why it doesn't work. Any ideas why this might be, or a way
to work around the problem?

Thank you so much again. You've done a fantastic job on Thinking
Sphinx.

Cheers
Alex



On Jan 26, 10:59 am, Pat Allan <[email protected]> wrote:
> Hi Alex
>
> I've no idea how common what you're trying to do is - it certainly sounds 
> reasonable, don't get me wrong. I've just never had someone ask in this group 
> how to solve such a scenario.
>
> What I have seen a fair bit of is situations where it's more of a 'many 
> franchises across multiple locations' kind of thing, where each location 
> belongs to only one franchise. That's what I was thinking of when I first 
> proposed a solution - because then you can search on locations and group by 
> franchise id to find just the closest of each franchise.
>
> You'll have no problems searching for the closest site (as you've found) - 
> but I don't think Sphinx will cut it for what you want with an array of 
> lat/lng values for each promotion. You could search for promotions, then list 
> sites by distance, but sorting by distance on promotions isn't something 
> Sphinx will handle in your setup, I'm pretty sure.
>
> Cheers
>
> --
> Pat
>
> On 25/01/2011, at 10:39 PM, Alex wrote:
>
>
>
> > Hi Pat,
>
> > I'm surprised to hear this isn't quite a common scenario. Applying the
> > logic to other similar models, for example Products and Stores. A
> > Store has a longitude and latitude, and the store has many Products.
> > Equally a Product can exist in many Stores. If you wanted to find
> > 'widgets' in stores in the London area, wouldn't this be modelled in a
> > similar way to my models described above?
>
> > Somehow I think I must be missing something, if this isn't a scenario
> > you've seen before.
>
> > As always, any insights would be greatly appreciated.
>
> > Thanks again.
> > Alex
>
> > On Jan 24, 11:56 pm, Pat Allan <[email protected]> wrote:
> >> Oh, it's a many-to-many... I didn't spot that the first time around. That 
> >> does make things more complicated. I've not seen this scenario before.
>
> >> To be honest, I can't think of a neat solution at the moment - you could 
> >> run a search per site using the same params but just for promotions, to 
> >> get the relevant promotion per site, but the performance on that would not 
> >> be ideal... and then you'll hit situations where for some sites you'll get 
> >> more than one promotion matching.
>
> >> Sorry Alex, I can't think of an easy way to do this.
>
> >> --
> >> Pat
>
> >> On 25/01/2011, at 7:14 AM, Alex wrote:
>
> >>> Hi Pat,
>
> >>> Thank you for replying so promptly, it's really appreciated.
>
> >>> As advised, I've added an index to the Site model, like so:
>
> >>> class Site < ActiveRecord::Base
> >>>  acts_as_mappable
>
> >>>  # associations
> >>>  has_many :campaigns, :dependent => :destroy
> >>>  has_many :promotions, :through => :campaigns
>
> >>>  define_index do
> >>>    indexes promotions.title, :as => :promotions_title
> >>>    indexes promotions.details, :as => :promotions_details
> >>>    has promotions(:id), :as => :promotions_ids
> >>>    has 'RADIANS(sites.lat)', :as => :lat, :type => :float
> >>>    has 'RADIANS(sites.lng)', :as => :lng, :type => :float
> >>>    set_property :latitude_attr   => "lat"
> >>>    set_property :longitude_attr  => "lng"
> >>>  end
> >>> end
>
> >>> Then in my controller I do a Site.search 'widgets', :geo => [@lat,
> >>> @lng], :with => {"@geodist" => 0.0..10}
>
> >>> Now, here is where I get stuck. Sorry for the newb question....
>
> >>> That returns me an array of Sites. How do I get to the Promotions that
> >>> are associated with those sites in my views?
>
> >>> Thank you again for all your help.
> >>> Alex
>
> >>> On Jan 24, 1:51 pm, Pat Allan <[email protected]> wrote:
> >>>> Hi Alex
>
> >>>> Sphinx doesn't understand arrays of floats - so you can't have multiple 
> >>>> lat/lng values for a single record.
>
> >>>> What you're going to need to do is have a search index for your Site 
> >>>> model, and search upon that. You can use associations to pull in 
> >>>> promotion titles and details, as well as adding a promotion id as an 
> >>>> attribute.
>
> >>>> If you want, you could group your Site search results by promotion id, 
> >>>> thus ensuring you don't get duplicate promotions (if that's what you'd 
> >>>> prefer).
>
> >>>> Let me know if you get stuck.
>
> >>>> Cheers
>
> >>>> --
> >>>> Pat
>
> >>>> On 25/01/2011, at 12:35 AM, Alex wrote:
>
> >>>>> Hi,
>
> >>>>> I have models set up as follows:
>
> >>>>> class Promotion < ActiveRecord::Base
>
> >>>>>  # associations
> >>>>>  has_many :campaigns, :dependent => :destroy
> >>>>>  has_many :sites, :through => :campaigns
>
> >>>>>  define_index do
> >>>>>    indexes :title
> >>>>>    indexes :details
>
> >>>>>    indexes sites.lat, :as => :site_lat
> >>>>>    indexes sites.lng, :as => :site_lng
> >>>>>    has 'RADIANS(sites.lat)', :as => :lat, :type => :float
> >>>>>    has 'RADIANS(sites.lng)', :as => :lng, :type => :float
> >>>>>    set_property :latitude_attr   => "lat"
> >>>>>    set_property :longitude_attr  => "lng"
> >>>>>    has status, starts_at, expires_at
> >>>>>  end
> >>>>> end
>
> >>>>> class Campaign < ActiveRecord::Base
> >>>>>  belongs_to :promotion
> >>>>>  belongs_to :site
> >>>>> end
>
> >>>>> class Site < ActiveRecord::Base
> >>>>>  acts_as_mappable
>
> >>>>>  # associations
> >>>>>  has_many :campaigns, :dependent => :destroy
> >>>>>  has_many :promotions, :through => :campaigns
> >>>>> end
>
> >>>>> When I call Promotion.search I only get results for the promotions
> >>>>> that have a single record in Campaigns. So, If I have a Promotion that
> >>>>> is associated with more than 1 Site, I don't get any results back for
> >>>>> that Promotion. For example, I might have a Promotion with a title of
> >>>>> 'widgets' that is available in Birmingham and London. If I search with
> >>>>> the keyword 'widget' and location 'London', I would expect my search
> >>>>> to return the promotion, but, it doesn't. If I delete from the
> >>>>> Campaigns table the row that associates the promotion to the site in
> >>>>> Birmingham, and search again, the promotion gets returned
> >>>>> successfully.
>
> >>>>> Can anyone advise why this is, and what I need to change about my
> >>>>> search to be able to return Promotions that are associated with more
> >>>>> than one site?
>
> >>>>> Thanks for all your help
> >>>>> Alex
>
> >>>>> --
> >>>>> 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 
> >>> 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 
> > 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.

Reply via email to