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(); }
private void CompareHits(IndexReader r, IndexReader joinR, TopDocs results, TopGroups<int> joinResults) { // results is 'complete'; joinResults is a subset int resultUpto = 0; int joinGroupUpto = 0; ScoreDoc[] hits = results.ScoreDocs; IGroupDocs<int>[] groupDocs = joinResults.Groups; while (joinGroupUpto < groupDocs.Length) { IGroupDocs<int> group = groupDocs[joinGroupUpto++]; ScoreDoc[] groupHits = group.ScoreDocs; assertNotNull(group.GroupValue); Document parentDoc = joinR.Document(group.GroupValue); string parentID = parentDoc.Get("parentID"); //System.out.println("GROUP groupDoc=" + group.groupDoc + " parent=" + parentDoc); assertNotNull(parentID); assertTrue(groupHits.Length > 0); for (int hitIDX = 0; hitIDX < groupHits.Length; hitIDX++) { Document nonJoinHit = r.Document(hits[resultUpto++].Doc); Document joinHit = joinR.Document(groupHits[hitIDX].Doc); assertEquals(parentID, nonJoinHit.Get("parentID")); assertEquals(joinHit.Get("childID"), nonJoinHit.Get("childID")); } if (joinGroupUpto < groupDocs.Length) { // Advance non-join hit to the next parentID: //System.out.println(" next joingroupUpto=" + joinGroupUpto + " gd.Length=" + groupDocs.Length + " parentID=" + parentID); while (true) { assertTrue(resultUpto < hits.Length); if (!parentID.Equals(r.Document(hits[resultUpto].Doc).Get("parentID"))) { break; } resultUpto++; } } } }