You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by md...@apache.org on 2020/06/03 20:19:47 UTC

[lucene-solr] branch master updated: LUCENE-9365 FuzzyQuery false negative when prefix length == search term length (#1545)

This is an automated email from the ASF dual-hosted git repository.

mdrob pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git


The following commit(s) were added to refs/heads/master by this push:
     new 45611d0  LUCENE-9365 FuzzyQuery false negative when prefix length == search term length (#1545)
45611d0 is described below

commit 45611d0647b860700e2ebd52c7c4695027c5c890
Author: Mike Drob <md...@apache.org>
AuthorDate: Wed Jun 3 15:19:30 2020 -0500

    LUCENE-9365 FuzzyQuery false negative when prefix length == search term length (#1545)
    
    Co-Authored-By: markharwood <ma...@gmail.com>
---
 .../java/org/apache/lucene/search/FuzzyQuery.java  |  2 +-
 .../org/apache/lucene/search/TestFuzzyQuery.java   | 41 +++++++++++++++++++++-
 2 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/lucene/core/src/java/org/apache/lucene/search/FuzzyQuery.java b/lucene/core/src/java/org/apache/lucene/search/FuzzyQuery.java
index 5dee8b4..041f0ca 100644
--- a/lucene/core/src/java/org/apache/lucene/search/FuzzyQuery.java
+++ b/lucene/core/src/java/org/apache/lucene/search/FuzzyQuery.java
@@ -169,7 +169,7 @@ public class FuzzyQuery extends MultiTermQuery {
 
   @Override
   protected TermsEnum getTermsEnum(Terms terms, AttributeSource atts) throws IOException {
-    if (maxEdits == 0 || prefixLength >= term.text().length()) {  // can only match if it's exact
+    if (maxEdits == 0) { // can only match if it's exact
       return new SingleTermsEnum(terms.iterator(), term.bytes());
     }
     return new FuzzyTermsEnum(terms, atts, getTerm(), maxEdits, prefixLength, transpositions);
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 b188612..4e9bf9d 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestFuzzyQuery.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestFuzzyQuery.java
@@ -224,7 +224,46 @@ public class TestFuzzyQuery extends LuceneTestCase {
     reader.close();
     directory.close();
   }
-  
+
+  public void testPrefixLengthEqualStringLength() throws Exception {
+    Directory directory = newDirectory();
+    RandomIndexWriter writer = new RandomIndexWriter(random(), directory);
+    addDoc("b*a", writer);
+    addDoc("b*ab", writer);
+    addDoc("b*abc", writer);
+    addDoc("b*abcd", writer);
+    String multibyte = "아프리카코끼리속";
+    addDoc(multibyte, writer);
+    IndexReader reader = writer.getReader();
+    IndexSearcher searcher = newSearcher(reader);
+    writer.close();
+
+    int maxEdits = 0;
+    int prefixLength = 3;
+    FuzzyQuery query = new FuzzyQuery(new Term("field", "b*a"), maxEdits, prefixLength);
+    ScoreDoc[] hits = searcher.search(query, 1000).scoreDocs;
+    assertEquals(1, hits.length);
+
+    maxEdits = 1;
+    query = new FuzzyQuery(new Term("field", "b*a"), maxEdits, prefixLength);
+    hits = searcher.search(query, 1000).scoreDocs;
+    assertEquals(2, hits.length);
+
+    maxEdits = 2;
+    query = new FuzzyQuery(new Term("field", "b*a"), maxEdits, prefixLength);
+    hits = searcher.search(query, 1000).scoreDocs;
+    assertEquals(3, hits.length);
+
+    maxEdits = 1;
+    prefixLength = multibyte.length() - 1;
+    query = new FuzzyQuery(new Term("field", multibyte.substring(0, prefixLength)), maxEdits, prefixLength);
+    hits = searcher.search(query, 1000).scoreDocs;
+    assertEquals(1, hits.length);
+
+    reader.close();
+    directory.close();
+  }
+
   public void test2() throws Exception {
     Directory directory = newDirectory();
     RandomIndexWriter writer = new RandomIndexWriter(random(), directory, new MockAnalyzer(random(), MockTokenizer.KEYWORD, false));