|
@@ -26,12 +26,15 @@ import org.apache.lucene.analysis.TokenFilter;
|
|
import org.apache.lucene.analysis.TokenStream;
|
|
import org.apache.lucene.analysis.TokenStream;
|
|
import org.apache.lucene.analysis.ngram.EdgeNGramTokenFilter;
|
|
import org.apache.lucene.analysis.ngram.EdgeNGramTokenFilter;
|
|
import org.apache.lucene.analysis.shingle.FixedShingleFilter;
|
|
import org.apache.lucene.analysis.shingle.FixedShingleFilter;
|
|
|
|
+import org.apache.lucene.analysis.tokenattributes.BytesTermAttribute;
|
|
import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
|
|
import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
|
|
import org.apache.lucene.analysis.tokenattributes.TermToBytesRefAttribute;
|
|
import org.apache.lucene.analysis.tokenattributes.TermToBytesRefAttribute;
|
|
import org.apache.lucene.document.Field;
|
|
import org.apache.lucene.document.Field;
|
|
import org.apache.lucene.index.IndexOptions;
|
|
import org.apache.lucene.index.IndexOptions;
|
|
import org.apache.lucene.index.IndexableField;
|
|
import org.apache.lucene.index.IndexableField;
|
|
import org.apache.lucene.index.Term;
|
|
import org.apache.lucene.index.Term;
|
|
|
|
+import org.apache.lucene.queries.intervals.Intervals;
|
|
|
|
+import org.apache.lucene.queries.intervals.IntervalsSource;
|
|
import org.apache.lucene.search.AutomatonQuery;
|
|
import org.apache.lucene.search.AutomatonQuery;
|
|
import org.apache.lucene.search.BooleanClause;
|
|
import org.apache.lucene.search.BooleanClause;
|
|
import org.apache.lucene.search.BooleanQuery;
|
|
import org.apache.lucene.search.BooleanQuery;
|
|
@@ -44,8 +47,6 @@ import org.apache.lucene.search.PrefixQuery;
|
|
import org.apache.lucene.search.Query;
|
|
import org.apache.lucene.search.Query;
|
|
import org.apache.lucene.search.SynonymQuery;
|
|
import org.apache.lucene.search.SynonymQuery;
|
|
import org.apache.lucene.search.TermQuery;
|
|
import org.apache.lucene.search.TermQuery;
|
|
-import org.apache.lucene.queries.intervals.Intervals;
|
|
|
|
-import org.apache.lucene.queries.intervals.IntervalsSource;
|
|
|
|
import org.apache.lucene.search.spans.FieldMaskingSpanQuery;
|
|
import org.apache.lucene.search.spans.FieldMaskingSpanQuery;
|
|
import org.apache.lucene.search.spans.SpanMultiTermQueryWrapper;
|
|
import org.apache.lucene.search.spans.SpanMultiTermQueryWrapper;
|
|
import org.apache.lucene.search.spans.SpanNearQuery;
|
|
import org.apache.lucene.search.spans.SpanNearQuery;
|
|
@@ -680,7 +681,10 @@ public class TextFieldMapper extends FieldMapper {
|
|
@Override
|
|
@Override
|
|
public Query phraseQuery(TokenStream stream, int slop, boolean enablePosIncrements) throws IOException {
|
|
public Query phraseQuery(TokenStream stream, int slop, boolean enablePosIncrements) throws IOException {
|
|
String field = name();
|
|
String field = name();
|
|
- if (indexPhrases && slop == 0 && hasGaps(stream) == false) {
|
|
|
|
|
|
+ // we can't use the index_phrases shortcut with slop, if there are gaps in the stream,
|
|
|
|
+ // or if the incoming token stream is the output of a token graph due to
|
|
|
|
+ // https://issues.apache.org/jira/browse/LUCENE-8916
|
|
|
|
+ if (indexPhrases && slop == 0 && hasGaps(stream) == false && stream.hasAttribute(BytesTermAttribute.class) == false) {
|
|
stream = new FixedShingleFilter(stream, 2);
|
|
stream = new FixedShingleFilter(stream, 2);
|
|
field = field + FAST_PHRASE_SUFFIX;
|
|
field = field + FAST_PHRASE_SUFFIX;
|
|
}
|
|
}
|
|
@@ -693,6 +697,9 @@ public class TextFieldMapper extends FieldMapper {
|
|
|
|
|
|
stream.reset();
|
|
stream.reset();
|
|
while (stream.incrementToken()) {
|
|
while (stream.incrementToken()) {
|
|
|
|
+ if (termAtt.getBytesRef() == null) {
|
|
|
|
+ throw new IllegalStateException("Null term while building phrase query");
|
|
|
|
+ }
|
|
if (enablePosIncrements) {
|
|
if (enablePosIncrements) {
|
|
position += posIncrAtt.getPositionIncrement();
|
|
position += posIncrAtt.getPositionIncrement();
|
|
}
|
|
}
|