You can use search_for_ids instead of search - that’ll avoid instantiating all 
of your Item objects via TS :)

> On 29 Jan 2015, at 11:44 pm, Misha Slyusarev <[email protected]> wrote:
> 
> Great thinking! That's probably what I can do if my idea won't work.
> 
> So yesterday I decided stop requesting TS for all records, but instead get 
> all item IDs (using  per_page: 1000) and then do another request to the DB 
> with left join and all required sorting. So this works. And according to 
> documentation a thousand of records is the maximum TS will return anyway. 
> What I'm concerning about is obviously performance.
> 
> So my guess is that TS will anyway do the same thing, that is, it will 
> firstly find all the IDs and secondly look for real data in the DB. Is it 
> true? And what do you think generally about this approach?
> 
> Thanks!
> Misha
> 
> On Wednesday, 28 January 2015 19:43:02 UTC-3, Pat Allan wrote:
> I’ve had to do something like this for clients in the past… but it’s never 
> particularly neat.
> 
> What you can do is add an attribute to your Item index indicating how many 
> variations it has:
> 
>     join item_variations # if you’re not using the association already in the 
> index
>     has “COUNT(item_variations.id <http://item_variations.id/>)”, :as => 
> :variations_count, :type => :integer
> 
> Also, add an attribute of the same name to your ItemVariation index:
> 
>     has “0”, :as => :variations_count, :type => :integer
> 
> And then, search across both models, but filter out items which have 
> variations:
> 
>     ThinkingSphinx.search params[:q],
>       :models => [Item, ItemVariation],
>       :with => {:variations_count => 0}
> 
> Of course, then you’re getting a mixture of records back from Sphinx, so your 
> views/controllers will need to manage that situation accordingly.
> 
> — 
> Pat
> 
>> On 29 Jan 2015, at 1:38 am, Misha Slyusarev <mik3w...@ <>gmail.com 
>> <http://gmail.com/>> wrote:
>> 
>> Yeah, I thought about that. The problem is that not all items have 
>> variations. :( :( :(
>> 
>> Also I came up with join instruction for index which give me actually what I 
>> wanted -- left join on item_variations. But I can't figure out how to 
>> - select fields that connected to the variation, like 
>> items_found[0].variaiton_id
>> - make TS not add GROUP by item ID, so I could have a few records with the 
>> same item ID but different variations IDs.
>> 
>> Any thoughts I can do it somehow?
>> 
>> Thanks!
>> 
>> On Wednesday, 28 January 2015 10:23:16 UTC-3, Pat Allan wrote:
>> Hi Misha
>> 
>> In this case I think you want to be searching on ItemVariation instead of 
>> Item - you’re asking Sphinx to return an Item more than once, and it doesn’t 
>> have the ability to do that. Having an index on ItemVariation (pulling in 
>> Item details in fields and attributes as needed) is almost certainly going 
>> to be a better fit.
>> 
>> Cheers
>> 
>> — 
>> Pat
>> 
>>> On 28 Jan 2015, at 3:03 am, Misha Slyusarev <mik3w...@ <>gmail.com 
>>> <http://gmail.com/>> wrote:
>>> 
>>> Hi Pat!
>>> Thank you for all your help so far! The problem is still actual though.
>>> 
>>> So basically what I want to get is an array where each of the elements 
>>> includes information from both Item and ItemVariation models (Item has_many 
>>> ItemVariations). Generally I can achieve this in ActiveRecord using left 
>>> join, but in ThinkingSphinx when I try to use same technic (as shown bellow 
>>> with joins: 'left join..') I fail since I get only first variation (first 
>>> element of the joined table) along with Item.
>>> 
>>> The idea behind that is to display variations alongside with items on the 
>>> list. And to be able to treat them independently.
>>> 
>>> Here is the query
>>> items_found = Item.search params[:q], 
>>>     :joins => 'left join item_variations iv on iv.item_id=items.id 
>>> <http://items.id/>',
>>>     :select => 'items.*, iv.id <http://iv.id/> as variation_id'
>>> 
>>> So bellow is what I'm getting
>>> items_found[0]:
>>>   id: 1
>>>   variation_id: 3434
>>> 
>>> items_found[1]:
>>>   id: 2
>>>   variation_id: nil
>>> 
>>> And here is what I want to get (here Item 1 goes with two variations and 
>>> they come as standalone elements of the array, and both have same item's 
>>> information, but different item variation's information)
>>> 
>>> items_found[0]:
>>>   id: 1
>>>   variation_id: 3434
>>> 
>>> items_found[1]:
>>>   id: 1
>>>   variation_id: 9898
>>> 
>>> items_found[2]:
>>>   id: 2
>>>   variation_id: nil
>>> 
>>> Please keep in mind that I use TS v2.0.10
>>> 
>>> Appreciate any advise or thoughts!
>>> Misha
>>> 
>>> On Monday, 10 November 2014 08:05:26 UTC-3, Pat Allan wrote:
>>> Hi Misha
>>> 
>>> Sphinx always paginates - there’s no way to turn that off. You can request 
>>> really large pages though (the default maximum is 1000 records, but that 
>>> can be modified):
>>> http://pat.github.io/thinking-sphinx/advanced_config.html#large-result-sets 
>>> <http://pat.github.io/thinking-sphinx/advanced_config.html#large-result-sets>
>>> 
>>> I’m not sure I quite understand what you’re after, though… if you want the 
>>> item_variations loaded from the database alongside each item (eager 
>>> loading), then you can pass through either :joins or :include options 
>>> nested within the :sql option. Same goes for :select.
>>> http://pat.github.io/thinking-sphinx/searching.html#advanced 
>>> <http://pat.github.io/thinking-sphinx/searching.html#advanced>
>>> 
>>> It’s worth noting, though, that Sphinx itself has no concept of joins - 
>>> there’s no way to tie one index to another.
>>> 
>>> Does that help? Have I missed something?
>>> 
>>> — 
>>> Pat
>>> 
>>> -- 
>>> You received this message because you are subscribed to the Google Groups 
>>> "Thinking Sphinx" group.
>>> To unsubscribe from this group and stop receiving emails from it, send an 
>>> email to thinking-sphi...@ <>googlegroups. <http://googlegroups.com/>com 
>>> <http://googlegroups.com/>.
>>> To post to this group, send email to thinkin...@ <>googlegroups.com 
>>> <http://googlegroups.com/>.
>>> Visit this group at http://groups.google.com/group/thinking-sphinx 
>>> <http://groups.google.com/group/thinking-sphinx>.
>>> For more options, visit https://groups.google.com/d/optout 
>>> <https://groups.google.com/d/optout>.
>> 
>> 
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Thinking Sphinx" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to thinking-sphi...@ <>googlegroups.com <http://googlegroups.com/>.
>> To post to this group, send email to thinkin...@ <>googlegroups. 
>> <http://googlegroups.com/>com <http://googlegroups.com/>.
>> Visit this group at http://groups.google.com/group/thinking-sphinx 
>> <http://groups.google.com/group/thinking-sphinx>.
>> For more options, visit https://groups.google.com/d/optout 
>> <https://groups.google.com/d/optout>.
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Thinking Sphinx" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected] 
> <mailto:[email protected]>.
> To post to this group, send email to [email protected] 
> <mailto:[email protected]>.
> Visit this group at http://groups.google.com/group/thinking-sphinx 
> <http://groups.google.com/group/thinking-sphinx>.
> For more options, visit https://groups.google.com/d/optout 
> <https://groups.google.com/d/optout>.

-- 
You received this message because you are subscribed to the Google Groups 
"Thinking Sphinx" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/thinking-sphinx.
For more options, visit https://groups.google.com/d/optout.

Reply via email to