Don't know if this is what you are looking for, but we had a similar 
requirement. In our case each folder had a unique identifier associated with it.

When generating the Solr input document our code populated 2 fields, 
parent_folder, and folder_hierarchy (multi-valued), and for a document in the 
root->foo->bar folder added:

parent_folder:<id of bar folder>
folder_hierarchy:<id of bar folder>
folder_hierarchy:<id of foo folder>
folder_hierarchy:<id of root folder>

At search time, if you wanted to restrict your search within the folder 'bar' 
we generated a filter query for either 'parent_folder:<id of bar folder>' or 
'folder_hierarchy:<id of bar folder>' depending on whether you wanted only 
documents directly under the 'bar' folder (your case 3), or at any level 
underneath 'bar' (your case 1).

If your folders don't have unique identifiers then you could achieve something 
similar by indexing the folder paths in string fields:

parent_folder:root|foo|bar
folder_hierarchy:root|foo|bar
folder_hierarchy:root|foo
folder_hierarchy:root

and generating a fq for either 'parent_folder:root|foo|bar' or 
'folder_hierarchy:root|foo|bar'

If you didn't want to have to generate all the permutations for the 
folder_hierarchy field before sending the document to Solr for indexing you 
should be able to do something like:

  <fieldType name="folder_path" class="solr.TextField" 
positionIncrementGap="100">
    <analyzer type="index">
      <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="|"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.KeywordTokenizerFactory"/>
    </analyzer>
  </fieldType>

   <field name="folder_parent"       type="string"               indexed="true" 
stored="true"  multiValued="false"/>
  <field name="folder_hierarchy"   type="folder_path"  indexed="true" 
stored="true"  multiValued="true"/>

  <copyField source="folder_parent" dest="folder_hierarchy"/>

In which case you could just send in the 'folder_parent' field and Solr would 
generate the folder_hierarchy field.

For cases 2 and 4 you could do something similar by adding 2 additional fields 
that just index the folder names instead of the paths.

- Andy -

-----Original Message-----
From: Steven White [mailto:swhite4...@gmail.com] 
Sent: Monday, April 20, 2015 9:49 AM
To: solr-user@lucene.apache.org
Subject: Re: Multilevel nested level support using Solr

Re sending to see if anyone can help.  Thanks

Steve

On Fri, Apr 17, 2015 at 12:14 PM, Steven White <swhite4...@gmail.com> wrote:

> Hi folks,
>
> In my DB, my records are nested in a folder base hierarchy:
>
> <Root>
>     <Level_1>
>         record_1
>         record_2
>         <Level_2>
>             record_3
>             record_4
>             <Level_3>
>                 record_5
>     <Level_1>
>         <Level_2>
>             <Level_3>
>                 record_6
>     record_7
>     record_8
>
> You got the idea.
>
> Is there anything in Solr that will let me preserve this structer and 
> thus when I'm searching to tell it in which level to narrow down the 
> search?  I have four search levels needs:
>
> 1) Be able to search inside only level: <Root>.<Level_1>.<Level_2>.* 
> (and everything under Level_2 from this path).
>
> 2) Be able to search inside a level regardless it's path: <Level_2>.* 
> (no matter where <Level_2> is, i want to search on all records under 
> Level_2 and everything under it's path.
>
> 3) Same as #1 but limit the search to within that level (nothing below 
> its level are searched).
>
> 4) Same as #3 but limit the search to within that level (nothing below 
> its level are searched).
>
> I found this:
> https://cwiki.apache.org/confluence/display/solr/Uploading+Data+with+I
> ndex+Handlers#UploadingDatawithIndexHandlers-NestedChildDocuments
> but it looks like it supports one level only and requires the whole 
> two levels be updated even if 1 of the doc in the nest is updated.
>
> Thanks
>
> Steve
>

Reply via email to