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