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.
