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.
