You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ro...@apache.org on 2022/02/04 17:20:52 UTC
[lucene] 01/02: LUCENE-10402: Prefix interval automaton should be declared binary (#646)
This is an automated email from the ASF dual-hosted git repository.
romseygeek pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/lucene.git
commit f426ab13934a672236790b47ee41d69164d147a0
Author: Alan Woodward <ro...@apache.org>
AuthorDate: Fri Feb 4 15:27:03 2022 +0000
LUCENE-10402: Prefix interval automaton should be declared binary (#646)
---
lucene/CHANGES.txt | 3 +++
.../src/java/org/apache/lucene/queries/intervals/Intervals.java | 9 ++++++++-
.../org/apache/lucene/queries/intervals/TestIntervalQuery.java | 9 ++++++++-
3 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 67cf52a..beda50d 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -186,6 +186,9 @@ Bug Fixes
* LUCENE-10401: Fix lookups on empty doc-value terms dictionaries to no longer
throw an ArrayIndexOutOfBoundsException. (Adrien Grand)
+* LUCENE-10402: Prefix intervals should declare their automaton as binary, otherwise prefixes
+ containing multibyte characters will not correctly match. (Alan Woodward)
+
Other
---------------------
diff --git a/lucene/queries/src/java/org/apache/lucene/queries/intervals/Intervals.java b/lucene/queries/src/java/org/apache/lucene/queries/intervals/Intervals.java
index c2346ee..398dad0 100644
--- a/lucene/queries/src/java/org/apache/lucene/queries/intervals/Intervals.java
+++ b/lucene/queries/src/java/org/apache/lucene/queries/intervals/Intervals.java
@@ -29,6 +29,7 @@ import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.automaton.CompiledAutomaton;
+import org.apache.lucene.util.automaton.Operations;
/**
* Factory functions for creating {@link IntervalsSource interval sources}.
@@ -157,7 +158,13 @@ public final class Intervals {
* @throws IllegalStateException if the prefix expands to more than {@code maxExpansions} terms
*/
public static IntervalsSource prefix(BytesRef prefix, int maxExpansions) {
- CompiledAutomaton ca = new CompiledAutomaton(PrefixQuery.toAutomaton(prefix));
+ CompiledAutomaton ca =
+ new CompiledAutomaton(
+ PrefixQuery.toAutomaton(prefix),
+ null,
+ true,
+ Operations.DEFAULT_DETERMINIZE_WORK_LIMIT,
+ true);
return new MultiTermIntervalsSource(ca, maxExpansions, prefix.utf8ToString() + "*");
}
diff --git a/lucene/queries/src/test/org/apache/lucene/queries/intervals/TestIntervalQuery.java b/lucene/queries/src/test/org/apache/lucene/queries/intervals/TestIntervalQuery.java
index ddd2988..190b4a1 100644
--- a/lucene/queries/src/test/org/apache/lucene/queries/intervals/TestIntervalQuery.java
+++ b/lucene/queries/src/test/org/apache/lucene/queries/intervals/TestIntervalQuery.java
@@ -31,6 +31,7 @@ import org.apache.lucene.tests.analysis.MockAnalyzer;
import org.apache.lucene.tests.index.RandomIndexWriter;
import org.apache.lucene.tests.search.CheckHits;
import org.apache.lucene.tests.util.LuceneTestCase;
+import org.apache.lucene.util.BytesRef;
public class TestIntervalQuery extends LuceneTestCase {
@@ -77,7 +78,8 @@ public class TestIntervalQuery extends LuceneTestCase {
"coordinate genome research",
"greater new york",
"x x x x x intend x x x message x x x message x x x addressed x x",
- "issue with intervals queries from search engine. So it's a big issue for us as we need to do ordered searches. Thank you to help us concerning that issue"
+ "issue with intervals queries from search engine. So it's a big issue for us as we need to do ordered searches. Thank you to help us concerning that issue",
+ "場外好朋友"
};
private void checkHits(Query query, int[] results) throws IOException {
@@ -416,4 +418,9 @@ public class TestIntervalQuery extends LuceneTestCase {
field, Intervals.containing(Intervals.term("w1"), new OneTimeIntervalSource()));
checkHits(q, new int[] {0, 1, 2, 3});
}
+
+ public void testUnicodePrefix() throws IOException {
+ Query q = new IntervalQuery(field, Intervals.prefix(new BytesRef("場")));
+ checkHits(q, new int[] {11});
+ }
}