Hi.  We’re just ramping up a product search engine for our eCommerce site, so 
this is all new development and we are slowly building up our Solr 
knowledgebase, so thanks in advance for any guidance.

Our catalog (mostly shoes and apparel) has three objects nested: Products 
(title, description, etc), items (color, price, etc), and SKU (size, etc).  
Since Solr doesn’t do documents nested three deep, the SKUs and items both get 
retrieved as children of products.  That has not bit us yet…  Also, our search 
results page expects a list of Item objects, then groups them (rolls them up) 
by their parent object.  Right now we are returning just the items, and that’s 
great, but we want to implement pagination of the products, so we need to 
return the items nested in products, then paginate on the products.

If I send ‘q=docType:Product description:Armour&fl=title, description,id,[child 
parentFilter="docType:Product" childFilter="docType:Item"]’ I get a nice list 
of products with items nested inside them. Woot.

The problem is, if we want to filter on item attributes, I get back products 
that have no children, which means we can’t paginate on the results if we 
remove those parents.  For instance, send ‘q=docType:Product 
description:Armour&fl=title, description,id,[child 
parentFilter="docType:Product" childFilter="docType:Item AND price:49.99"]’, we 
get the products and their items nicely nested, and only items with a price of 
49.99 are shown, but so are parents that have no matching items.

How can I build a query that will not return parents without children? I 
haven’t figured out a way to reference the children in the query.

Since we’re not in production yet, I can change lots of things here.  I would 
PREFER not to denormalize the documents into one document per SKU with all the 
item and product information too, as our catalog is quite large and that would 
lead to a huge import file and lots of duplicated content between documents in 
the index.  If that’s the only way, though, it is possible.

Thanks in advance.

Reply via email to