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