You stumbled upon the whole point of block join – that the documents are and 
must be managed as a block and not individually.

-- Jack Krupansky

From: danny teichthal 
Sent: Sunday, March 16, 2014 6:47 AM
To: solr-user@lucene.apache.org 
Subject: Nested documents, block join - re-indexing a single document upon 
update




Hi All,




To make things short, I would like to use block joins, but to be able to index 
each document on the block separately.

Is it possible?



In more details:



We have some nested parent-child structure where:

1.       Parent may have a single level of children

2.       Parent and child documents may be updated independently.

3.       We may want to search for parent by child info and vise versa.



At first we thought of managing the parent and child in different documents, 
de-normalizing child data at parent level and parent data on child level.

After reading Mikhail blog 
http://blog.griddynamics.com/2013/09/solr-block-join-support.html, we thought 
of using the block join for this purpose.



But, I got into a wall when trying to update a single child document.

For me, it’s ok if SOLR will internally index the whole block, I just don’t 
want to fetch the whole hierarchy from DB for update.



I was trying to achieve this using atomic updates – since all the fields must 
be stored anyway – if I send an atomic update on one of the children with the 
_root_ field then there’s no need to send the whole hierarchy.

But, when I try this method, I see that the child document is indeed updated, 
but it’s order is changed to be after the parent.



This is what I did:

1.       Change the root field to be stored - <field name="_root_" 
type="string" indexed="true" stored="true"/>

2.       Put attached docs on example\exampledocs.

3.       Run post.jar on parent-child.xml

4.       Run post.jar on update-child-atomic.xml.

5.       Now - 
http://localhost:8983/solr/collection1/select?q=%7B!parent+which%3D%27type_s%3Aparent%27%7D%2BCOLOR_s%3ARed+%2BSIZE_s%3AXL%0A&wt=json&indent=true,
 returns parent 10 as expected.

6.       But,  
http://localhost:8983/solr/collection1/select?q={!parent+which%3D'type_s%3Aparent'}%2BCOLOR_s%3AGreen+%2BSIZE_s%3AXL%0A&wt=json&indent=true
 – returns nothing.

7.       When searching *:* on Admin,   record with id=12 was updated with 
‘Green’, but it is returned below the parent record.

8.        



Thanks in advance.



In case the attachments does not work:

1st file to post:



<update>

  <delete><query>*:*</query></delete>

  <add>

    <doc>

      <field name="id">10</field>

      <field name="type_s">parent</field>

      <field name="BRAND_s">Nike</field>

      <doc>

        <field name="id">11</field>

        <field name="COLOR_s">Red</field>

        <field name="SIZE_s">XL</field>

      </doc>

      <doc>

        <field name="id">12</field>

        <field name="COLOR_s">Blue</field>

        <field name="SIZE_s">XL</field>

      </doc>

    </doc>    

  </add>

  <commit/>

</update>







2nd file:



<update>  

  <add>    

      <doc>

        <field name="id">12</field>

        <field name="COLOR_s" update="set">Green</field>

        <field name="SIZE_s">XL</field>

                                <field name="_root_" >10</field>

      </doc>

    </doc>    

  </add>

  <commit/>

</update>

Reply via email to