I went through this a couple more times. In your first reply, you said
"the searches aren't actually happening." What's strange is that from
the console, I get 118 records, but when run in rake I get 1 record.
Doesn't that mean that some part of the search is executing? It's
always seems to be the User half and not the Contact half. That's why
I was wondering if there was something not right with the loading by
type.

Right now, I'm going through the TS code, but I haven't found anything
yet.

On Aug 28, 8:31 am, gobigdave <[email protected]> wrote:
> As an experiment, I changed:
>
> matching_people_ids = Person.search(people_search_options(:select =>
> "people.id", :max_matches => MAX_MATCHES, :per_page =>
> MAX_MATCHES)).map { |p| p.id }
>
> to:
>
> matching_people = Person.search(people_search_options(:select =>
> "people.id", :max_matches => MAX_MATCHES, :per_page => MAX_MATCHES))
> tmp = matching_people.first
> matching_people_ids = matching_people.map { |p| p.id }
>
> I still get the same issue.
>
> Also, is this behavior different for each environment? I notice that
> everything works in development, but it doesn't work on my staging
> environment. Since it doesn't work, I haven't pushed it to production
> yet, so I can't comment about that.
>
> On Aug 28, 7:25 am, gobigdave <[email protected]> wrote:
>
>
>
> > I'm confused. I left out some code to keep things simple in my
> > example. Build_matches! actually tracks results and determines new
> > matches and removes old matches.
>
> > def build_matches!
> >   self.search!  # changes the state
>
> >   existing_people_ids = self.matches.find(:all, :select =>
> > "matches.person_id").map { |r| r.person_id }
> >   matching_people_ids = Person.search(people_search_options(:select =>
> > "people.id", :max_matches => MAX_MATCHES, :per_page =>
> > MAX_MATCHES)).map { |p| p.id }
>
> >   new_matches = matching_people_ids - existing_people_ids
> >   no_longer_matching = existing_people_ids - matching_people_ids
>
> >   # process new, no longer matching, etc.
>
> >   return self.complete!  # returns true
> > end
>
> > Wouldn't the call to map be the same as first since it requires going
> > through the entire result set? I may not be rendering the result set,
> > but I am definitely looping through the entire thing. Plus, since
> > build_matches! returns true, the console never actually 'renders' the
> > search results.
>
> > -Dave
>
> > On Aug 28, 5:22 am, Pat Allan <[email protected]> wrote:
>
> > > Issue 1 is because Sphinx stores the class names - built off the type  
> > > column if there is one - as integers, and then interprets that back to  
> > > class names when searching. Hence the split between User and Contact.
>
> > > It's not related to issue 2, I'm pretty certain. This one is because  
> > > Sphinx lazily loads search results - it works in console, because to  
> > > 'render' each result, it needs to know the contents of the array, and  
> > > so makes the query to Sphinx to find out. In larger amounts of code,  
> > > and without the need to 'render' results to screen, the searches  
> > > aren't actually happening.
>
> > > To get around this, you could do the following
>
> > > def self.build_all_matches
> > >    Request.all.each do |request|
> > >      request.build_matches!.first
> > >    end
> > > end
>
> > > The call to first *needs* to know about the search results, and so  
> > > each will get populated from Sphinx.
>
> > > Hope this makes sense - it's not the easiest thing to describe.
>
> > > --
> > > Pat
>
> > > On 28/08/2009, at 3:59 AM, gobigdave wrote:
>
> > > > My application allows users to save searches. These saved searches are
> > > > planned to be executed each night with a rake task, but I'm getting
> > > > inconsistent results. It's very strange.
>
> > > > There are three classes of people:
>
> > > > class Person < ActiveRecord::Base
> > > > define_index do
> > > >   # My index definition is here
> > > > end
> > > > end
>
> > > > class User < Person; end
> > > > class Contact < Person; end
>
> > > > My saved search class is Request.
>
> > > > class Request < ActiveRecord::Base
> > > > def self.build_all_matches
> > > >  Request.all.each do |request|
> > > >    request.build_matches!
> > > >  end
> > > > end
> > > > def build_matches!
> > > >  # All the searching takes place here
> > > >  Person.search(people_search_options)
> > > > end
> > > > end
>
> > > > Finally, there is a rake task:
>
> > > > task :build_all_matches => :environment do
> > > >  Request.build_all_matches
> > > > end
>
> > > > Debugging this, I found several confusing issues.
>
> > > > 1. From the console or from my application, executing
> > > > Request.build_all_matches or Request.first.build_matches! produces the
> > > > expected results. However, I noticed something strange in the logs.
> > > > Even though the build_matches! method calls Person.search, the logs
> > > > have:
>
> > > > SELECT people.id FROM `people` WHERE (`people`.`id` IN
> > > > (963,926,1008,984,931,929,36,1009,1006,993,947,33,930,62,187,98,407,1010,49
> > > >  
> > > > ,202,1005,156,954,248,177,55,256,179,266,183,271,274,288,292,196,31,126,301
> > > >  
> > > > ,133,318,320,331,16,338,341,345,240,165,352,355,356,364,371,374,375,378,401
> > > >  
> > > > ,258,408,409,414,548,549,560,575,580,584,591,602,611,616,293,631,297,657,19
> > > >  
> > > > 9,662,664,694,695,697,698,723,730,741,751,209,773,790,796,798,801,826,834,8
> > > >  
> > > > 46,858,348,879,882,905,912,918,269,871,347,254,251,769,336,306,224,658,637,
> > > >  619,299,201,192))
> > > > AND ( (`people`.`type` = 'Contact' ) )
> > > > SELECT people.id FROM `people` WHERE (`people`.`id` IN (1336)) AND
> > > > (`people`.`activated` = 1) AND ( (`people`.`type` = 'User') )
>
> > > > Why is TS loading User and Contact people separately? I called
> > > > Person.search. Shouldn't it only do a Person.find(:all, :conditions =>
> > > > "people.id in (...)") and not bother trying to separate records by
> > > > type?
>
> > > > I bring this up because I think this is where the problem is. See
> > > > number 2.
>
> > > > 2. Now, when I run the build_all_matches rake task and look through
> > > > the logs for the same instance of Request executing, I only see this
> > > > in the logs:
>
> > > > SELECT people.id FROM `people` WHERE (`people`.`id` IN (1336)) AND
> > > > (`people`.`activated` = 1) AND ( (`people`.`type` = 'User') )
>
> > > > The select with (`people`.`type` = 'Contact' ) is not executed, and
> > > > the results of build_matches! is incorrect. There is only 1 person
> > > > returned from Person.search instead of the 118 I expected. I verified
> > > > with several log statements that the same inputs are happening. It's
> > > > always the load of people.type = 'User' that is skipped on all Request
> > > > objects, but ONLY when I run it from the rake task.  Same thing
> > > > happens if I make rake task that only calls build_matches! on a single
> > > > Request object.
>
> > > > Rake, console, searchd, and web app are all running as the same user.
> > > > I am using version 1.2.7 of the gem on Rails 2.3.3, Ruby 1.8.6, and
> > > > rake 0.8.7.
>
> > > > Help! I've been staring at this for hours, and it doesn't make any
> > > > sense. I'm guessing it's something about the way rake loads Rails that
> > > > is causing TS to get confused, but I haven't found where or how yet.
--~--~---------~--~----~------------~-------~--~----~
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