[ 
https://issues.apache.org/jira/browse/SOLR-12637?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18085004#comment-18085004
 ] 

Dmitry Tikhonov edited comment on SOLR-12637 at 5/31/26 4:52 PM:
-----------------------------------------------------------------

Thanks [~dsmiley]  — the current {{[child]}} implementation reconstructs the 
hierarchy correctly. One behavior that wasn't obvious to me from the docs: when 
{{limit}} is used (e.g. {{{}[child limit=2]{}}}), the limit applies to the 
{*}total number of returned descendants across the whole subtree{*}, not per 
nesting level or per parent.

For a three-level parent:
 
{code:java}
product_1
  sku_1
    sub_sku_1_1
    sub_sku_1_2
    sub_sku_1_3
  sku_2
    sub_sku_2_1
    ... {code}
{{[child limit=2]}} returns {{sku_1}} and {{sub_sku_1_1}} — the first two 
descendants in document order — and stops, rather than, say, the first two 
children at each level. That was surprising at first.

{{[subquery]}} does solve this, since it gives independent 
{{{}rows{}}}/{{{}sort{}}}/{{{}start{}}} per level — but at the cost of an extra 
query per parent document (N+1).

Two things that I think would make {{[child]}} stronger:
 # *Sorting and pagination of children* (e.g. sort variants by rating, or page 
within a parent). Today children come back in document order with only a total 
cap.
 # *Per-parent / per-level limits* instead of a single flat limit over the 
flattened subtree.

One possible direction: implement this as a SearchComponent that runs after the 
main result set is collected and batch-fetches descendants for all matched 
parents in a single query — e.g.
{code:java}
{!terms f=_root_ separator=||}product_1||product_2... {code}
then groups them back by _{{{}_root__{}}}. That avoids {{{}[subquery]{}}}'s N+1 
(one extra query for the whole page of parents instead of one per parent) while 
still allowing sort, pagination, and per-parent limits. I've prototyped 
something close to this for a four-level catalog specifically to eliminate the 
N+1 cost, and it worked well.

To be clear, {{[child]}} is great as-is for shallow hierarchies and small 
fan-out where you're not using {{limit}} — it's only the deep-hierarchy + 
{{limit}} combination where the semantics get surprising.


was (Author: squallsama):
Thanks [~dsmiley]  — the current {{[child]}} implementation reconstructs the 
hierarchy correctly. One behavior that wasn't obvious to me from the docs: when 
{{limit}} is used (e.g. {{{}[child limit=2]{}}}), the limit applies to the 
{*}total number of returned descendants across the whole subtree{*}, not per 
nesting level or per parent.

For a three-level parent:
 
{code:java}
product_1
  sku_1
    sub_sku_1_1
    sub_sku_1_2
    sub_sku_1_3
  sku_2
    sub_sku_2_1
    ... {code}
{{[child limit=2]}} returns {{sku_1}} and {{sub_sku_1_1}} — the first two 
descendants in document order — and stops, rather than, say, the first two 
children at each level. That was surprising at first.

{{[subquery]}} does solve this, since it gives independent 
{{{}rows{}}}/{{{}sort{}}}/{{{}start{}}} per level — but at the cost of an extra 
query per parent document (N+1).

Two things that I think would make {{[child]}} stronger:
 # *Sorting and pagination of children* (e.g. sort variants by rating, or page 
within a parent). Today children come back in document order with only a total 
cap.
 # *Per-parent / per-level limits* instead of a single flat limit over the 
flattened subtree.

One possible direction: implement this as a SearchComponent that runs after the 
main result set is collected and batch-fetches descendants for all matched 
parents in a single query — e.g. {{{!terms f=_root_ 
separator=||}product_1||product_2...}} — then groups them back by 
{{{}_root_{}}}. That avoids {{{}[subquery]{}}}'s N+1 (one extra query for the 
whole page of parents instead of one per parent) while still allowing sort, 
pagination, and per-parent limits. I've prototyped something close to this for 
a four-level catalog specifically to eliminate the N+1 cost, and it worked well.

To be clear, {{[child]}} is great as-is for shallow hierarchies and small 
fan-out where you're not using {{limit}} — it's only the deep-hierarchy + 
{{limit}} combination where the semantics get surprising.

> Return matching child documents' descendant documents using 
> ChildDocTransformer
> -------------------------------------------------------------------------------
>
>                 Key: SOLR-12637
>                 URL: https://issues.apache.org/jira/browse/SOLR-12637
>             Project: Solr
>          Issue Type: Sub-task
>            Reporter: mosh
>            Priority: Major
>
> It has dawned upon me that we do not get matching children's descendant 
> documents when there is a child Filter for a specific field in a child 
> document query.
> I was thinking perhaps we should use the paths in the filter, rewind to the 
> document proceeding the previous parent, and check each document if its path 
> contains the filter. That way we can add the matching child documents 
> descendants.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to