Hi Pat,

Your suggestion got me there. The group by was raising an error, which
I was able to get to by doing:

Campaign.search(args).results[:error]

It all appears to be working nicely now. Thanks for all your help.

Cheers
Alex


On Jan 28, 10:00 pm, Alex <[email protected]> wrote:
> Thanks Pat. I will give it a go.
>
> Cheers
> Alex
>
> On Jan 27, 10:44 pm, Pat Allan <[email protected]> wrote:
>
>
>
> > Hi Alex
>
> > Smart thinking with the index going on the Campaign model! Sounds like 
> > that'll get around the multiple sites/promotions issue nicely.
>
> > What does your query look like when you're grouping? And what does your 
> > index definition look like in your Campaign model? Also, it's probably 
> > worth checking whether there's any warnings in the search - if you're using 
> > TS 2.0.2 or 1.4.2:
>
> >   Campaign.search(arguments go here).warning
>
> > Otherwise, in older releases:
>
> >   Campaign.search(arguments go here).results[:warning]
>
> > That may hold a clue to the zero results being returned.
>
> > Cheers
>
> > --
> > Pat
>
> > On 28/01/2011, at 2:17 AM, Alex wrote:
>
> > > 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
>
> ...
>
> read more »

-- 
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