You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2016/09/13 09:04:28 UTC

lucene-solr:master: LUCENE-7439: improve test case

Repository: lucene-solr
Updated Branches:
  refs/heads/master ef3057e43 -> 4db3e7b8a


LUCENE-7439: improve test case


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/4db3e7b8
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/4db3e7b8
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/4db3e7b8

Branch: refs/heads/master
Commit: 4db3e7b8a7ca818002af9041bf10660c25905915
Parents: ef3057e
Author: Mike McCandless <mi...@apache.org>
Authored: Tue Sep 13 05:04:18 2016 -0400
Committer: Mike McCandless <mi...@apache.org>
Committed: Tue Sep 13 05:04:18 2016 -0400

----------------------------------------------------------------------
 .../apache/lucene/search/TestFuzzyQuery.java    | 64 +++++++++++++++++---
 1 file changed, 55 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4db3e7b8/lucene/core/src/test/org/apache/lucene/search/TestFuzzyQuery.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestFuzzyQuery.java b/lucene/core/src/test/org/apache/lucene/search/TestFuzzyQuery.java
index a59449c..1e90525 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestFuzzyQuery.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestFuzzyQuery.java
@@ -18,7 +18,9 @@ package org.apache.lucene.search;
 
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -523,6 +525,7 @@ public class TestFuzzyQuery extends LuceneTestCase {
       w.addDocument(doc);
     }
     DirectoryReader r = w.getReader();
+    //System.out.println("TEST: reader=" + r);
     IndexSearcher s = newSearcher(r);
     int iters = atLeast(1000);
     for(int iter=0;iter<iters;iter++) {
@@ -531,38 +534,54 @@ public class TestFuzzyQuery extends LuceneTestCase {
       String queryPrefix = queryTerm.substring(0, prefixLength);
 
       // we don't look at scores here:
-      Set<String>[] expected = new Set[3];
+      List<TermAndScore>[] expected = new List[3];
       for(int ed=0;ed<3;ed++) {
-        expected[ed] = new HashSet<String>();
+        expected[ed] = new ArrayList<TermAndScore>();
       }
       for(String term : terms) {
         if (term.startsWith(queryPrefix) == false) {
           continue;
         }
         int ed = getDistance(term, queryTerm);
-        if (Math.min(queryTerm.length(), term.length()) > ed) {
+        if (Math.min(queryTerm.length(), term.length()) > ed) {        
+          float score = 1f - (float) ed / (float) Math.min(queryTerm.length(), term.length());
           while (ed < 3) {
-            expected[ed].add(term);
+            expected[ed].add(new TermAndScore(term, score));
             ed++;
           }
         }
       }
 
       for(int ed=0;ed<3;ed++) {
-        FuzzyQuery query = new FuzzyQuery(new Term("field", queryTerm), ed, prefixLength, terms.size(), true);
+        Collections.sort(expected[ed]);
+        int queueSize = TestUtil.nextInt(random(), 1, terms.size());
+        /*
+        System.out.println("\nTEST: query=" + queryTerm + " ed=" + ed + " queueSize=" + queueSize + " vs expected match size=" + expected[ed].size() + " prefixLength=" + prefixLength);
+        for(TermAndScore ent : expected[ed]) {
+          System.out.println("  " + ent);
+        }
+        */
+        FuzzyQuery query = new FuzzyQuery(new Term("field", queryTerm), ed, prefixLength, queueSize, true);
         TopDocs hits = s.search(query, terms.size());
         Set<String> actual = new HashSet<>();
         for(ScoreDoc hit : hits.scoreDocs) {
           Document doc = s.doc(hit.doc);
           actual.add(doc.get("field"));
+          //System.out.println("   actual: " + doc.get("field") + " score=" + hit.score);
+        }
+        Set<String> expectedTop = new HashSet<>();
+        int limit = Math.min(queueSize, expected[ed].size());
+        for(int i=0;i<limit;i++) {
+          expectedTop.add(expected[ed].get(i).term);
         }
-        if (actual.equals(expected[ed]) == false) {
+        
+        if (actual.equals(expectedTop) == false) {
           StringBuilder sb = new StringBuilder();
-          sb.append("FAILED: query=" + queryTerm + " ed=" + ed + " prefixLength=" + prefixLength + "\n");
+          sb.append("FAILED: query=" + queryTerm + " ed=" + ed + " queueSize=" + queueSize + " vs expected match size=" + expected[ed].size() + " prefixLength=" + prefixLength + "\n");
 
           boolean first = true;
           for(String term : actual) {
-            if (expected[ed].contains(term) == false) {
+            if (expectedTop.contains(term) == false) {
               if (first) {
                 sb.append("  these matched but shouldn't:\n");
                 first = false;
@@ -571,7 +590,7 @@ public class TestFuzzyQuery extends LuceneTestCase {
             }
           }
           first = true;
-          for(String term : expected[ed]) {
+          for(String term : expectedTop) {
             if (actual.contains(term) == false) {
               if (first) {
                 sb.append("  these did not match but should:\n");
@@ -588,6 +607,33 @@ public class TestFuzzyQuery extends LuceneTestCase {
     IOUtils.close(r, w, dir);
   }
 
+  private static class TermAndScore implements Comparable<TermAndScore> {
+    final String term;
+    final float score;
+    
+    public TermAndScore(String term, float score) {
+      this.term = term;
+      this.score = score;
+    }
+
+    @Override
+    public int compareTo(TermAndScore other) {
+      // higher score sorts first, and if scores are tied, lower term sorts first
+      if (score > other.score) {
+        return -1;
+      } else if (score < other.score) {
+        return 1;
+      } else {
+        return term.compareTo(other.term);
+      }
+    }
+
+    @Override
+    public String toString() {
+      return term + " score=" + score;
+    }
+  }
+
   // Poached from LuceneLevenshteinDistance.java (from suggest module): it supports transpositions (treats them as ed=1, not ed=2)
   private static int getDistance(String target, String other) {
     IntsRef targetPoints;