public void TestGetTopGroups()
{
Directory dir = NewDirectory();
RandomIndexWriter w = new RandomIndexWriter(Random(), dir, Similarity, TimeZone);
IList<Document> docs = new List<Document>();
docs.Add(MakeJob("ruby", 2005));
docs.Add(MakeJob("java", 2006));
docs.Add(MakeJob("java", 2010));
docs.Add(MakeJob("java", 2012));
CollectionsHelper.Shuffle(docs);
docs.Add(MakeResume("Frank", "United States"));
AddSkillless(w);
w.AddDocuments(docs);
AddSkillless(w);
IndexReader r = w.Reader;
w.Dispose();
IndexSearcher s = new IndexSearcher(r);
// Create a filter that defines "parent" documents in the index - in this case resumes
Filter parentsFilter = new FixedBitSetCachingWrapperFilter(new QueryWrapperFilter(new TermQuery(new Term("docType", "resume"))));
// Define child document criteria (finds an example of relevant work experience)
BooleanQuery childQuery = new BooleanQuery();
childQuery.Add(new BooleanClause(new TermQuery(new Term("skill", "java")), BooleanClause.Occur.MUST));
childQuery.Add(new BooleanClause(NumericRangeQuery.NewIntRange("year", 2006, 2011, true, true), BooleanClause.Occur.MUST));
// Wrap the child document query to 'join' any matches
// up to corresponding parent:
ToParentBlockJoinQuery childJoinQuery = new ToParentBlockJoinQuery(childQuery, parentsFilter, ScoreMode.Avg);
ToParentBlockJoinCollector c = new ToParentBlockJoinCollector(Sort.RELEVANCE, 2, true, true);
s.Search(childJoinQuery, c);
//Get all child documents within groups
TopGroups<int>[] getTopGroupsResults = new TopGroups<int>[2];
getTopGroupsResults[0] = c.GetTopGroups(childJoinQuery, null, 0, 10, 0, true);
getTopGroupsResults[1] = c.GetTopGroupsWithAllChildDocs(childJoinQuery, null, 0, 0, true);
foreach (TopGroups<int> results in getTopGroupsResults)
{
assertFalse(float.IsNaN(results.MaxScore));
assertEquals(2, results.TotalGroupedHitCount);
assertEquals(1, results.Groups.Length);
IGroupDocs<int> resultGroup = results.Groups[0];
assertEquals(2, resultGroup.TotalHits);
assertFalse(float.IsNaN(resultGroup.Score));
assertNotNull(resultGroup.GroupValue);
Document parentDocument = s.Doc(resultGroup.GroupValue);
assertEquals("Frank", parentDocument.Get("name"));
assertEquals(2, resultGroup.ScoreDocs.Length); //all matched child documents collected
foreach (ScoreDoc scoreDoc in resultGroup.ScoreDocs)
{
Document childDoc = s.Doc(scoreDoc.Doc);
assertEquals("java", childDoc.Get("skill"));
int year = Convert.ToInt32(childDoc.Get("year"));
assertTrue(year >= 2006 && year <= 2011);
}
}
//Get part of child documents
TopGroups<int> boundedResults = c.GetTopGroups(childJoinQuery, null, 0, 1, 0, true);
assertFalse(float.IsNaN(boundedResults.MaxScore));
assertEquals(2, boundedResults.TotalGroupedHitCount);
assertEquals(1, boundedResults.Groups.Length);
IGroupDocs<int> group = boundedResults.Groups[0];
assertEquals(2, group.TotalHits);
assertFalse(float.IsNaN(group.Score));
assertNotNull(group.GroupValue);
Document parentDoc = s.Doc(group.GroupValue);
assertEquals("Frank", parentDoc.Get("name"));
assertEquals(1, group.ScoreDocs.Length); //not all matched child documents collected
foreach (ScoreDoc scoreDoc in group.ScoreDocs)
{
Document childDoc = s.Doc(scoreDoc.Doc);
assertEquals("java", childDoc.Get("skill"));
int year = Convert.ToInt32(childDoc.Get("year"));
assertTrue(year >= 2006 && year <= 2011);
}
r.Dispose();
dir.Dispose();
}