public virtual void TestBasic() { // create a sort field and sort by it (reverse order) Query query = new TermQuery(new Term("body", "contents")); IndexReader r = Searcher.IndexReader; // Just first pass query TopDocs hits = Searcher.Search(query, 10); Assert.AreEqual(3, hits.TotalHits); Assert.AreEqual("3", r.Document(hits.ScoreDocs[0].Doc).Get("id")); Assert.AreEqual("1", r.Document(hits.ScoreDocs[1].Doc).Get("id")); Assert.AreEqual("2", r.Document(hits.ScoreDocs[2].Doc).Get("id")); // Now, rescore: Sort sort = new Sort(new SortField("popularity", SortFieldType.INT32, true)); Rescorer rescorer = new SortRescorer(sort); hits = rescorer.Rescore(Searcher, hits, 10); Assert.AreEqual(3, hits.TotalHits); Assert.AreEqual("2", r.Document(hits.ScoreDocs[0].Doc).Get("id")); Assert.AreEqual("1", r.Document(hits.ScoreDocs[1].Doc).Get("id")); Assert.AreEqual("3", r.Document(hits.ScoreDocs[2].Doc).Get("id")); string expl = rescorer.Explain(Searcher, Searcher.Explain(query, hits.ScoreDocs[0].Doc), hits.ScoreDocs[0].Doc).ToString(); // Confirm the explanation breaks out the individual // sort fields: Assert.IsTrue(expl.Contains("= sort field <int: \"popularity\">! value=20")); // Confirm the explanation includes first pass details: Assert.IsTrue(expl.Contains("= first pass score")); Assert.IsTrue(expl.Contains("body:contents in")); }
public virtual void TestRandom() { Directory dir = NewDirectory(); int numDocs = AtLeast(1000); RandomIndexWriter w = new RandomIndexWriter(Random(), dir, Similarity, TimeZone); int[] idToNum = new int[numDocs]; int maxValue = TestUtil.NextInt(Random(), 10, 1000000); for (int i = 0; i < numDocs; i++) { Document doc = new Document(); doc.Add(NewStringField("id", "" + i, Field.Store.YES)); int numTokens = TestUtil.NextInt(Random(), 1, 10); StringBuilder b = new StringBuilder(); for (int j = 0; j < numTokens; j++) { b.Append("a "); } doc.Add(NewTextField("field", b.ToString(), Field.Store.NO)); idToNum[i] = Random().Next(maxValue); doc.Add(new NumericDocValuesField("num", idToNum[i])); w.AddDocument(doc); } IndexReader r = w.Reader; w.Dispose(); IndexSearcher s = NewSearcher(r); int numHits = TestUtil.NextInt(Random(), 1, numDocs); bool reverse = Random().NextBoolean(); TopDocs hits = s.Search(new TermQuery(new Term("field", "a")), numHits); Rescorer rescorer = new SortRescorer(new Sort(new SortField("num", SortFieldType.INT32, reverse))); TopDocs hits2 = rescorer.Rescore(s, hits, numHits); int[] expected = new int[numHits]; for (int i = 0; i < numHits; i++) { expected[i] = hits.ScoreDocs[i].Doc; } int reverseInt = reverse ? -1 : 1; Array.Sort(expected, new ComparerAnonymousInnerClassHelper(this, idToNum, r, reverseInt)); bool fail = false; for (int i = 0; i < numHits; i++) { fail |= (int)expected[i] != hits2.ScoreDocs[i].Doc; } Assert.IsFalse(fail); r.Dispose(); dir.Dispose(); }
public ComparerAnonymousInnerClassHelper(SortRescorer outerInstance) { this.outerInstance = outerInstance; }
public virtual void TestRandom() { Directory dir = NewDirectory(); int numDocs = AtLeast(1000); RandomIndexWriter w = new RandomIndexWriter( #if FEATURE_INSTANCE_TESTDATA_INITIALIZATION this, #endif Random, dir); int[] idToNum = new int[numDocs]; int maxValue = TestUtil.NextInt32(Random, 10, 1000000); for (int i = 0; i < numDocs; i++) { Document doc = new Document(); doc.Add(NewStringField("id", "" + i, Field.Store.YES)); int numTokens = TestUtil.NextInt32(Random, 1, 10); StringBuilder b = new StringBuilder(); for (int j = 0; j < numTokens; j++) { b.Append("a "); } doc.Add(NewTextField("field", b.ToString(), Field.Store.NO)); idToNum[i] = Random.Next(maxValue); doc.Add(new NumericDocValuesField("num", idToNum[i])); w.AddDocument(doc); } IndexReader r = w.GetReader(); w.Dispose(); IndexSearcher s = NewSearcher(r); int numHits = TestUtil.NextInt32(Random, 1, numDocs); bool reverse = Random.NextBoolean(); TopDocs hits = s.Search(new TermQuery(new Term("field", "a")), numHits); Rescorer rescorer = new SortRescorer(new Sort(new SortField("num", SortFieldType.INT32, reverse))); TopDocs hits2 = rescorer.Rescore(s, hits, numHits); int[] expected = new int[numHits]; for (int i = 0; i < numHits; i++) { expected[i] = hits.ScoreDocs[i].Doc; } int reverseInt = reverse ? -1 : 1; Array.Sort(expected, Comparer <int> .Create((a, b) => { try { int av = idToNum[Convert.ToInt32(r.Document(a).Get("id"))]; int bv = idToNum[Convert.ToInt32(r.Document(b).Get("id"))]; if (av < bv) { return(-reverseInt); } else if (bv < av) { return(reverseInt); } else { // Tie break by docID, ascending return(a - b); } } catch (Exception ioe) when(ioe.IsIOException()) { throw RuntimeException.Create(ioe); } })); bool fail = false; for (int i = 0; i < numHits; i++) { fail |= (int)expected[i] != hits2.ScoreDocs[i].Doc; } Assert.IsFalse(fail); r.Dispose(); dir.Dispose(); }