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));