| Index: lucene/core/src/test/org/apache/lucene/search/TestFuzzyQuery.java |
| =================================================================== |
| --- lucene/core/src/test/org/apache/lucene/search/TestFuzzyQuery.java (revision 1571281) |
| +++ lucene/core/src/test/org/apache/lucene/search/TestFuzzyQuery.java (working copy) |
| @@ -48,6 +48,8 @@ |
| addDoc("abbbb", writer); |
| addDoc("bbbbb", writer); |
| addDoc("ddddd", writer); |
| + addDoc("eeee", writer); |
| + addDoc("eeeeee", writer); |
| |
| IndexReader reader = writer.getReader(); |
| IndexSearcher searcher = newSearcher(reader); |
| @@ -186,6 +188,17 @@ |
| hits = searcher.search(query, null, 1000).scoreDocs; |
| assertEquals(0, hits.length); |
| |
| + // test precision/rounding issues |
| + query = new FuzzyQuery(new Term("field", "eeeee"), |
| + FuzzyQuery.floatToEdits(0.8f, 5), 0); |
| + hits = searcher.search(query, null, 1000).scoreDocs; |
| + assertEquals(2, hits.length); |
| + |
| + query = new FuzzyQuery(new Term("field", "ddddX"), |
| + FuzzyQuery.floatToEdits(0.8f, 5), 0); |
| + hits = searcher.search(query, null, 1000).scoreDocs; |
| + assertEquals(1, hits.length); |
| + |
| reader.close(); |
| directory.close(); |
| } |
| Index: lucene/core/src/java/org/apache/lucene/search/FuzzyQuery.java |
| =================================================================== |
| --- lucene/core/src/java/org/apache/lucene/search/FuzzyQuery.java (revision 1571281) |
| +++ lucene/core/src/java/org/apache/lucene/search/FuzzyQuery.java (working copy) |
| @@ -57,7 +57,9 @@ |
| public final static int defaultPrefixLength = 0; |
| public final static int defaultMaxExpansions = 50; |
| public final static boolean defaultTranspositions = true; |
| - |
| + |
| + //amount to round in floatToEdits |
| + private final static float FUZZY_ROUND = 0.01f; |
| private final int maxEdits; |
| private final int maxExpansions; |
| private final boolean transpositions; |
| @@ -235,7 +237,7 @@ |
| } else if (minimumSimilarity == 0.0f) { |
| return 0; // 0 means exact, not infinite # of edits! |
| } else { |
| - return Math.min((int) ((1D-minimumSimilarity) * termLen), |
| + return Math.min((int) (((1D-minimumSimilarity) * termLen)+FUZZY_ROUND), |
| LevenshteinAutomata.MAXIMUM_SUPPORTED_DISTANCE); |
| } |
| } |