Does grouping work for you here? Because even if you solve this problem, if I'm reading this right you're going to fetch stored values for every doc that matches the query, which is an anti-pattern big-time, consider *:*....
Of course I did a very quick skim, so maybe I'm all wet.... Best, Erick On Thu, Nov 27, 2014 at 5:28 PM, Darin Amos <dari...@gmail.com> wrote: > Hello, > > I am trying to implement a Rollup Search component on a version of SOLR that > exists previously to the parent/child additions, so I am trying to implement > my own. The searches will be executed exclusively against the child > documents, and I want to “rollup” those child documents into the parent > documents. > > The interface is going to allow the user to add the following parameters to > the SOLR query: > > &rollup=true&rollup.parentField=id&rollup.childField=parentId > > My code so far is below. What I have works so far, except my second parent > query loses the order. I would like to be able to sort my parent query by the > score of the previous child search. Perhaps I would take the highest score > from all children (haven’t decided yet). My problem however is that I don’t > know how I can get the score from all the hits in the original search, just > what is returned. If my child query gets 10,000 hits, but only return 100 > records, I can’t get all the scores I need. > > Does anyone have any recommendations? > > Thanks!! > Darin > > > //Loop through all the records and look for the > parent reference field > Set<String> parentRefs = new HashSet<String>(); > DocIterator docSetIterator = > rb.getResults().docSet.iterator(); > while(docSetIterator.hasNext()){ > int docInt = docSetIterator.next(); > String fieldValues[] = > rb.req.getSearcher().doc(docInt).getValues(childFieldName); > > for(String fieldValue : fieldValues){ > if(fieldValue != null && > fieldValue.length() > 0 && !parentRefs.contains(fieldValue)){ > parentRefs.add(fieldValue); > } > } > } > > //Build a boolean query of term queries > BooleanQuery parentQuery = new BooleanQuery(); > Iterator<String> parentIdIterator = > parentRefs.iterator(); > while(parentIdIterator.hasNext()){ > String parentId = parentIdIterator.next(); > TermQuery termQuery = new TermQuery(new > Term(parentFieldName, parentId)); > parentQuery.add(termQuery, > BooleanClause.Occur.SHOULD); > } > > > DocList parentList = searcher.getDocList(parentQuery, > new ArrayList<Query>(), null, 0, 100, 1); //TODO: use correct start/end/flags > later... > > //Add parent results > ResultContext resultContext = new ResultContext(); > resultContext.docs = parentList; > resultContext.query = parentQuery; > rb.rsp.add("parents", resultContext); > rb.rsp.getToLog().add("hits", parentList.matches());