Thanks Alex, this has been extremely helpful. There's one doubt though. The query returns expected result if I use "select" or "query" request handler, but fails for others. Here's the debug output from "/select" using edismax.
http://localhost:8983/solr/techproducts/query?q=({!join%20from=manu_id_s%20to=id}ipod)(name:GB18030%20-manu_id_s:*)&fl=id,title&debug=query&wt=xml&hl=false&spellcheck=false&defType=edismax *<str name="parsedquery">(+(JoinQuery({!join from=manu_id_s to=id}text:ipod) (name:gb18030 -manu_id_s:*)))/no_coord</str> <str name="parsedquery_toString">+({!join from=manu_id_s to=id}text:ipod (name:gb18030 -manu_id_s:*))</str> * Now, if I use "/browse", I don't get any results back. Here's a snippet from browse request handler config. <requestHandler name="/browse" class="solr.SearchHandler"> <lst name="defaults"> <str name="echoParams">explicit</str> <str name="wt">velocity</str> <str name="v.template">browse</str> <str name="v.layout">layout</str> <str name="title">Solritas</str> <str name="defType">edismax</str> <str name="qf"> text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0 manu^1.1 cat^1.4 title^10.0 description^5.0 keywords^5.0 author^2.0 resourcename^1.0 subject^0.5 </str> <str name="mm">100%</str> <str name="q.alt">*:*</str> <str name="rows">10</str> <str name="fl">*,score</str> As you can see, I've defined the "qf" fields with defType as edismax. Here's the query: http://localhost:8983/solr/techproducts/browse?q=({!join%20from=manu_id_s%20to=id}ipod)(name:GB18030%20-manu_id_s:*)&debug=query&wt=xml&hl=false&spellcheck=false Output: *<str name="parsedquery">(+((JoinQuery({!join from=manu_id_s to=id}text:ipod) (DisjunctionMaxQuery((keywords:name:gb18030^5.0 | author:name:gb18030^2.0 | ((subject:name subject:gb subject:18030)~3)^0.5 | manu:name:gb18030^1.1 | ((description:name description:gb description:18030)~3)^5.0 | ((title:name title:gb title:18030)~3)^10.0 | features:name:gb18030 | cat:name:GB18030^1.4 | name:name:gb18030^1.2 | text:name:gb18030^0.5 | id:name:GB18030^10.0 | resourcename:name:gb18030 | sku:"namegb 18030"^1.5)) -manu_id_s:*))~2))/no_coord</str> <str name="parsedquery_toString">+(({!join from=manu_id_s to=id}text:ipod ((keywords:name:gb18030^5.0 | author:name:gb18030^2.0 | ((subject:name subject:gb subject:18030)~3)^0.5 | manu:name:gb18030^1.1 | ((description:name description:gb description:18030)~3)^5.0 | ((title:name title:gb title:18030)~3)^10.0 | features:name:gb18030 | cat:name:GB18030^1.4 | name:name:gb18030^1.2 | text:name:gb18030^0.5 | id:name:GB18030^10.0 | resourcename:name:gb18030 | sku:"namegb 18030"^1.5) -manu_id_s:*))~2)</str>* If I remove the join query condition ({!join from=manu_id_s to=id}ipod) , the query returns the result based on the second condition. The other doubt I've is why "text" is getting picked as a default field in the join condition? I've defined the "df" fields in "browse" which are being used in the second condition. Do I need to explicitly set the df fields inside the join condition? The other thing I've noticed is the difference in parsed query if I add a space in between the two clause. For e.g. *q=({!join from=manu_id_s to=id}ipod) (name:GB18030 -manu_id_s:*)* results in *<str name="parsedquery">(+((JoinQuery({!join from=manu_id_s to=id}text:ipod) (name:gb18030 -manu_id_s:*))~2))/no_coord</str> <str name="parsedquery_toString">+(({!join from=manu_id_s to=id}text:ipod (name:gb18030 -manu_id_s:*))~2)</str>* -- View this message in context: http://lucene.472066.n3.nabble.com/How-to-retrieve-parent-documents-without-a-nested-structure-block-join-tp4297510p4298115.html Sent from the Solr - User mailing list archive at Nabble.com.