// TODO: ideally we'd test > Short.MAX_VALUE too, but compilation is currently recursive. // so if we want to test such huge expressions, we need to instead change parser to use an explicit Stack /// <exception cref="System.Exception"></exception> private void DoTestLotsOfBindings(int n) { SimpleBindings bindings = new SimpleBindings(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < n; i++) { if (i > 0) { sb.Append("+"); } sb.Append("x" + i); bindings.Add(new SortField("x" + i, SortFieldType.SCORE)); } var expr = JavascriptCompiler.Compile(sb.ToString()); var sort = new Sort(expr.GetSortField(bindings, true)); Query query = new TermQuery(new Term("body", "contents")); TopFieldDocs td = searcher.Search(query, null, 3, sort, true, true); for (int i_1 = 0; i_1 < 3; i_1++) { FieldDoc d = (FieldDoc)td.ScoreDocs[i_1]; float expected = n * d.Score; float actual = (float)((double)d.Fields[0]); AreEqual(expected, actual, CheckHits.ExplainToleranceDelta(expected, actual)); } }
public virtual void TestSortValues() { var expr = JavascriptCompiler.Compile("sqrt(_score)"); SimpleBindings bindings = new SimpleBindings(); bindings.Add(new SortField("_score", SortFieldType.SCORE)); Sort sort = new Sort(expr.GetSortField(bindings, true)); Query query = new TermQuery(new Term("body", "contents")); TopFieldDocs td = searcher.Search(query, null, 3, sort, true, true); for (int i = 0; i < 3; i++) { FieldDoc d = (FieldDoc)td.ScoreDocs[i]; float expected = (float)Math.Sqrt(d.Score); float actual = (float)((double)d.Fields[0]); AreEqual(expected, actual, CheckHits.ExplainToleranceDelta(expected, actual)); } }
public virtual void TestTwoOfSameBinding() { var expr = JavascriptCompiler.Compile("_score + _score"); SimpleBindings bindings = new SimpleBindings(); bindings.Add(new SortField("_score", SortFieldType.SCORE)); Sort sort = new Sort(expr.GetSortField(bindings, true)); Query query = new TermQuery(new Term("body", "contents")); TopFieldDocs td = searcher.Search(query, null, 3, sort, true, true); for (int i = 0; i < 3; i++) { FieldDoc d = (FieldDoc)td.ScoreDocs[i]; float expected = 2 * d.Score; float actual = ((J2N.Numerics.Double)d.Fields[0]).ToSingle(); Assert.AreEqual(expected, actual, CheckHits.ExplainToleranceDelta (expected, actual)); } }
public virtual void TestExpressionRefersToExpression() { var expr1 = JavascriptCompiler.Compile("_score"); var expr2 = JavascriptCompiler.Compile("2*expr1"); var bindings = new SimpleBindings(); bindings.Add(new SortField("_score", SortFieldType.SCORE)); bindings.Add("expr1", expr1); Sort sort = new Sort(expr2.GetSortField(bindings, true)); Query query = new TermQuery(new Term("body", "contents")); TopFieldDocs td = searcher.Search(query, null, 3, sort, true, true); for (int i = 0; i < 3; i++) { FieldDoc d = (FieldDoc)td.ScoreDocs[i]; float expected = 2 * d.Score; float actual = (float)((double)d.Fields[0]); Assert.AreEqual(expected, actual, CheckHits.ExplainToleranceDelta (expected, actual)); } }
// verify results are as expected. private void VerifyResults(float boost, IndexSearcher s, IDictionary <int, float> h1, IDictionary <int, float> h2customNeutral, IDictionary <int, float> h3CustomMul, IDictionary <int, float> h4CustomAdd, IDictionary <int, float> h5CustomMulAdd, Query q1, Query q2, Query q3, Query q4, Query q5) { // verify numbers of matches Log("#hits = " + h1.Count); assertEquals("queries should have same #hits", h1.Count, h2customNeutral.Count); assertEquals("queries should have same #hits", h1.Count, h3CustomMul.Count); assertEquals("queries should have same #hits", h1.Count, h4CustomAdd.Count); assertEquals("queries should have same #hits", h1.Count, h5CustomMulAdd.Count); QueryUtils.Check(Random(), q1, s, Rarely(), Similarity); QueryUtils.Check(Random(), q2, s, Rarely(), Similarity); QueryUtils.Check(Random(), q3, s, Rarely(), Similarity); QueryUtils.Check(Random(), q4, s, Rarely(), Similarity); QueryUtils.Check(Random(), q5, s, Rarely(), Similarity); // verify scores ratios foreach (int doc in h1.Keys) { Log("doc = " + doc); float fieldScore = ExpectedFieldScore(s.IndexReader.Document(doc).Get(ID_FIELD)); Log("fieldScore = " + fieldScore); assertTrue("fieldScore should not be 0", fieldScore > 0); float score1 = h1[doc]; LogResult("score1=", s, q1, doc, score1); float score2 = h2customNeutral[doc]; LogResult("score2=", s, q2, doc, score2); assertEquals("same score (just boosted) for neutral", boost * score1, score2, CheckHits.ExplainToleranceDelta(boost * score1, score2)); float score3 = h3CustomMul[doc]; LogResult("score3=", s, q3, doc, score3); assertEquals("new score for custom mul", boost * fieldScore * score1, score3, CheckHits.ExplainToleranceDelta(boost * fieldScore * score1, score3)); float score4 = h4CustomAdd[doc]; LogResult("score4=", s, q4, doc, score4); assertEquals("new score for custom add", boost * (fieldScore + score1), score4, CheckHits.ExplainToleranceDelta(boost * (fieldScore + score1), score4)); float score5 = h5CustomMulAdd[doc]; LogResult("score5=", s, q5, doc, score5); assertEquals("new score for custom mul add", boost * fieldScore * (score1 + fieldScore), score5, CheckHits.ExplainToleranceDelta(boost * fieldScore * (score1 + fieldScore), score5)); } }