This is an automated email from the ASF dual-hosted git repository.
paulirwin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/lucenenet.git
The following commit(s) were added to refs/heads/master by this push:
new 98af2bb00 FuzzyQuery produces a wrong result when prefix is equal to
the term length (#1002)
98af2bb00 is described below
commit 98af2bb00e22827a6c9ab73b2f4c5cab6b6b5bd2
Author: Paul Irwin <[email protected]>
AuthorDate: Mon Nov 4 09:46:53 2024 -0700
FuzzyQuery produces a wrong result when prefix is equal to the term length
(#1002)
* FuzzyQuery produces a wrong result when prefix is equal to the term
length
https://github.com/apache/lucenenet/issues/941
* Add LUCENENET-specific backport comment, fix test code style
---------
Co-authored-by: tohidemyname <tohidemyname>
---
src/Lucene.Net.Tests/Search/TestFuzzyQuery.cs | 44 ++++++++++++++++++++++++++-
src/Lucene.Net/Search/FuzzyQuery.cs | 5 +--
2 files changed, 46 insertions(+), 3 deletions(-)
diff --git a/src/Lucene.Net.Tests/Search/TestFuzzyQuery.cs
b/src/Lucene.Net.Tests/Search/TestFuzzyQuery.cs
index f63aa4b3b..6f8a8c81a 100644
--- a/src/Lucene.Net.Tests/Search/TestFuzzyQuery.cs
+++ b/src/Lucene.Net.Tests/Search/TestFuzzyQuery.cs
@@ -196,6 +196,48 @@ namespace Lucene.Net.Search
directory.Dispose();
}
+ // LUCENENET-specific: backported fix from Lucene 9.0.0
(lucene@45611d0, LUCENE-9365)
+ [Test]
+ public void TestPrefixLengthEqualStringLength()
+ {
+ 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);
+ const string multibyte = "아프리카코끼리속"; // LUCENENET-specific: made
const
+ AddDoc(multibyte, writer);
+ IndexReader reader = writer.GetReader();
+ IndexSearcher searcher = NewSearcher(reader);
+ writer.Dispose();
+
+ 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.Dispose();
+ directory.Dispose();
+ }
+
[Test]
public virtual void Test2()
{
@@ -384,4 +426,4 @@ namespace Lucene.Net.Search
writer.AddDocument(doc);
}
}
-}
\ No newline at end of file
+}
diff --git a/src/Lucene.Net/Search/FuzzyQuery.cs
b/src/Lucene.Net/Search/FuzzyQuery.cs
index 6fafa67f6..a9f8cdf57 100644
--- a/src/Lucene.Net/Search/FuzzyQuery.cs
+++ b/src/Lucene.Net/Search/FuzzyQuery.cs
@@ -148,7 +148,8 @@ namespace Lucene.Net.Search
protected override TermsEnum GetTermsEnum(Terms terms, AttributeSource
atts)
{
- if (maxEdits == 0 || prefixLength >= term.Text.Length) // can only
match if it's exact
+ // LUCENENET-specific: backported fix from Lucene 9.0.0
(lucene@45611d0, LUCENE-9365)
+ if (maxEdits == 0) // can only match if it's exact
{
return new SingleTermsEnum(terms.GetEnumerator(), term.Bytes);
}
@@ -262,4 +263,4 @@ namespace Lucene.Net.Search
}
}
}
-}
\ No newline at end of file
+}