From 5d42177b9290b61c658154e42223408944cd4bc1 Mon Sep 17 00:00:00 2001 From: Erik Hatcher Date: Tue, 2 May 2017 19:41:06 -0400 Subject: [PATCH] SOLR-1485: improve TokenStream API usage --- .../search/PayloadCheckQParserPlugin.java | 8 ++++- .../search/PayloadScoreQParserPlugin.java | 9 ++++- .../org/apache/solr/util/PayloadUtils.java | 36 +++++++++---------- 3 files changed, 31 insertions(+), 22 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/search/PayloadCheckQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/PayloadCheckQParserPlugin.java index 83090bf0c80..e5702bf659e 100644 --- a/solr/core/src/java/org/apache/solr/search/PayloadCheckQParserPlugin.java +++ b/solr/core/src/java/org/apache/solr/search/PayloadCheckQParserPlugin.java @@ -17,6 +17,7 @@ package org.apache.solr.search; +import java.io.IOException; import java.lang.invoke.MethodHandles; import java.util.ArrayList; import java.util.List; @@ -67,7 +68,12 @@ public class PayloadCheckQParserPlugin extends QParserPlugin { FieldType ft = req.getCore().getLatestSchema().getFieldType(field); Analyzer analyzer = ft.getQueryAnalyzer(); - SpanQuery query = PayloadUtils.createSpanQuery(field, value, analyzer); + SpanQuery query = null; + try { + query = PayloadUtils.createSpanQuery(field, value, analyzer); + } catch (IOException e) { + throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e); + } if (query == null) { throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "SpanQuery is null"); diff --git a/solr/core/src/java/org/apache/solr/search/PayloadScoreQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/PayloadScoreQParserPlugin.java index f9dd8962ed1..4098e0928d5 100644 --- a/solr/core/src/java/org/apache/solr/search/PayloadScoreQParserPlugin.java +++ b/solr/core/src/java/org/apache/solr/search/PayloadScoreQParserPlugin.java @@ -17,6 +17,8 @@ package org.apache.solr.search; +import java.io.IOException; + import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.queries.payloads.PayloadFunction; import org.apache.lucene.queries.payloads.PayloadScoreQuery; @@ -61,7 +63,12 @@ public class PayloadScoreQParserPlugin extends QParserPlugin { FieldType ft = req.getCore().getLatestSchema().getFieldType(field); Analyzer analyzer = ft.getQueryAnalyzer(); - SpanQuery query = PayloadUtils.createSpanQuery(field, value, analyzer); + SpanQuery query = null; + try { + query = PayloadUtils.createSpanQuery(field, value, analyzer); + } catch (IOException e) { + throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,e); + } if (query == null) { throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "SpanQuery is null"); diff --git a/solr/core/src/java/org/apache/solr/util/PayloadUtils.java b/solr/core/src/java/org/apache/solr/util/PayloadUtils.java index 32e2fd95240..6fe8a6199ae 100644 --- a/solr/core/src/java/org/apache/solr/util/PayloadUtils.java +++ b/solr/core/src/java/org/apache/solr/util/PayloadUtils.java @@ -38,7 +38,6 @@ import org.apache.lucene.search.spans.SpanQuery; import org.apache.lucene.search.spans.SpanTermQuery; import org.apache.lucene.util.BytesRef; import org.apache.solr.analysis.TokenizerChain; -import org.apache.solr.common.SolrException; import org.apache.solr.schema.FieldType; public class PayloadUtils { @@ -100,34 +99,31 @@ public class PayloadUtils { return payloadFunction; } - public static SpanQuery createSpanQuery(String field, String value, Analyzer analyzer) { - SpanQuery query; - try { - // adapted this from QueryBuilder.createSpanQuery (which isn't currently public) and added reset(), end(), and close() calls - TokenStream in = analyzer.tokenStream(field, value); + /** + * The generated SpanQuery will be either a SpanTermQuery or an ordered, zero slop SpanNearQuery, depending + * on how many tokens are emitted. + */ + public static SpanQuery createSpanQuery(String field, String value, Analyzer analyzer) throws IOException { + // adapted this from QueryBuilder.createSpanQuery (which isn't currently public) and added reset(), end(), and close() calls + List terms = new ArrayList<>(); + try (TokenStream in = analyzer.tokenStream(field, value)) { in.reset(); TermToBytesRefAttribute termAtt = in.getAttribute(TermToBytesRefAttribute.class); - - List terms = new ArrayList<>(); while (in.incrementToken()) { terms.add(new SpanTermQuery(new Term(field, termAtt.getBytesRef()))); } in.end(); - in.close(); + } - if (terms.isEmpty()) { - query = null; - } else if (terms.size() == 1) { - query = terms.get(0); - } else { - query = new SpanNearQuery(terms.toArray(new SpanTermQuery[terms.size()]), 0, true); - } - } catch (IOException e) { - throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e); + SpanQuery query; + if (terms.isEmpty()) { + query = null; + } else if (terms.size() == 1) { + query = terms.get(0); + } else { + query = new SpanNearQuery(terms.toArray(new SpanTermQuery[terms.size()]), 0, true); } return query; } - - }