summaryrefslogtreecommitdiff
path: root/core/src/main/java/org
diff options
context:
space:
mode:
authorJim Ferenczi <jim.ferenczi@elastic.co>2017-02-27 18:39:04 +0100
committerGitHub <noreply@github.com>2017-02-27 18:39:04 +0100
commit5c84640126e66de68f6e742ccb1a9d351f638fd4 (patch)
tree37f88eb250a94681c0e3083e7e539334975d6073 /core/src/main/java/org
parent48280a940379e5ba7839c9dd2d1483951855473a (diff)
Upgrade to lucene-6.5.0-snapshot-d00c5ca (#23385)
Lucene upgrade
Diffstat (limited to 'core/src/main/java/org')
-rw-r--r--core/src/main/java/org/apache/lucene/queryparser/classic/MapperQueryParser.java43
-rw-r--r--core/src/main/java/org/elasticsearch/action/search/SearchPhaseController.java6
-rw-r--r--core/src/main/java/org/elasticsearch/index/analysis/PatternReplaceCharFilterFactory.java13
-rw-r--r--core/src/main/java/org/elasticsearch/index/search/MatchQuery.java49
-rw-r--r--core/src/main/java/org/elasticsearch/search/aggregations/metrics/tophits/InternalTopHits.java4
-rw-r--r--core/src/main/java/org/elasticsearch/search/profile/query/ProfileScorer.java2
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggester.java4
7 files changed, 77 insertions, 44 deletions
diff --git a/core/src/main/java/org/apache/lucene/queryparser/classic/MapperQueryParser.java b/core/src/main/java/org/apache/lucene/queryparser/classic/MapperQueryParser.java
index c1998c6500..2b2576b50b 100644
--- a/core/src/main/java/org/apache/lucene/queryparser/classic/MapperQueryParser.java
+++ b/core/src/main/java/org/apache/lucene/queryparser/classic/MapperQueryParser.java
@@ -19,9 +19,6 @@
package org.apache.lucene.queryparser.classic;
-import static java.util.Collections.unmodifiableMap;
-import static org.elasticsearch.common.lucene.search.Queries.fixNegativeQueryIfNeeded;
-
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
@@ -33,12 +30,14 @@ import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.BoostQuery;
import org.apache.lucene.search.DisjunctionMaxQuery;
import org.apache.lucene.search.FuzzyQuery;
-import org.apache.lucene.search.GraphQuery;
import org.apache.lucene.search.MatchNoDocsQuery;
import org.apache.lucene.search.MultiPhraseQuery;
import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.SynonymQuery;
+import org.apache.lucene.search.spans.SpanNearQuery;
+import org.apache.lucene.search.spans.SpanOrQuery;
+import org.apache.lucene.search.spans.SpanQuery;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.IOUtils;
import org.apache.lucene.util.automaton.RegExp;
@@ -59,6 +58,9 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
+import static java.util.Collections.unmodifiableMap;
+import static org.elasticsearch.common.lucene.search.Queries.fixNegativeQueryIfNeeded;
+
/**
* A query parser that uses the {@link MapperService} in order to build smarter
* queries based on the mapping information.
@@ -747,26 +749,29 @@ public class MapperQueryParser extends AnalyzingQueryParser {
MultiPhraseQuery.Builder builder = new MultiPhraseQuery.Builder((MultiPhraseQuery) q);
builder.setSlop(slop);
return builder.build();
- } else if (q instanceof GraphQuery && ((GraphQuery) q).hasPhrase()) {
- // we have a graph query that has at least one phrase sub-query
- // re-build and set slop on all phrase queries
- List<Query> oldQueries = ((GraphQuery) q).getQueries();
- Query[] queries = new Query[oldQueries.size()];
- for (int i = 0; i < queries.length; i++) {
- Query oldQuery = oldQueries.get(i);
- if (oldQuery instanceof PhraseQuery) {
- queries[i] = addSlopToPhrase((PhraseQuery) oldQuery, slop);
- } else {
- queries[i] = oldQuery;
- }
- }
-
- return new GraphQuery(queries);
+ } else if (q instanceof SpanQuery) {
+ return addSlopToSpan((SpanQuery) q, slop);
} else {
return q;
}
}
+ private Query addSlopToSpan(SpanQuery query, int slop) {
+ if (query instanceof SpanNearQuery) {
+ return new SpanNearQuery(((SpanNearQuery) query).getClauses(), slop,
+ ((SpanNearQuery) query).isInOrder());
+ } else if (query instanceof SpanOrQuery) {
+ SpanQuery[] clauses = new SpanQuery[((SpanOrQuery) query).getClauses().length];
+ int pos = 0;
+ for (SpanQuery clause : ((SpanOrQuery) query).getClauses()) {
+ clauses[pos++] = (SpanQuery) addSlopToSpan(clause, slop);
+ }
+ return new SpanOrQuery(clauses);
+ } else {
+ return query;
+ }
+ }
+
/**
* Rebuild a phrase query with a slop value
*/
diff --git a/core/src/main/java/org/elasticsearch/action/search/SearchPhaseController.java b/core/src/main/java/org/elasticsearch/action/search/SearchPhaseController.java
index 068a005204..cec44d9e9e 100644
--- a/core/src/main/java/org/elasticsearch/action/search/SearchPhaseController.java
+++ b/core/src/main/java/org/elasticsearch/action/search/SearchPhaseController.java
@@ -62,11 +62,9 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
-import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
@@ -243,11 +241,11 @@ public class SearchPhaseController extends AbstractComponent {
final Sort sort = new Sort(firstTopDocs.fields);
final TopFieldDocs[] shardTopDocs = new TopFieldDocs[resultsArr.length()];
fillTopDocs(shardTopDocs, results, new TopFieldDocs(0, new FieldDoc[0], sort.getSort(), Float.NaN));
- mergedTopDocs = TopDocs.merge(sort, from, topN, shardTopDocs);
+ mergedTopDocs = TopDocs.merge(sort, from, topN, shardTopDocs, true);
} else {
final TopDocs[] shardTopDocs = new TopDocs[resultsArr.length()];
fillTopDocs(shardTopDocs, results, Lucene.EMPTY_TOP_DOCS);
- mergedTopDocs = TopDocs.merge(from, topN, shardTopDocs);
+ mergedTopDocs = TopDocs.merge(from, topN, shardTopDocs, true);
}
ScoreDoc[] scoreDocs = mergedTopDocs.scoreDocs;
diff --git a/core/src/main/java/org/elasticsearch/index/analysis/PatternReplaceCharFilterFactory.java b/core/src/main/java/org/elasticsearch/index/analysis/PatternReplaceCharFilterFactory.java
index db428db153..2562f20373 100644
--- a/core/src/main/java/org/elasticsearch/index/analysis/PatternReplaceCharFilterFactory.java
+++ b/core/src/main/java/org/elasticsearch/index/analysis/PatternReplaceCharFilterFactory.java
@@ -18,6 +18,9 @@
*/
package org.elasticsearch.index.analysis;
+import java.io.Reader;
+import java.util.regex.Pattern;
+
import org.apache.lucene.analysis.pattern.PatternReplaceCharFilter;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.regex.Regex;
@@ -25,10 +28,7 @@ import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.env.Environment;
import org.elasticsearch.index.IndexSettings;
-import java.io.Reader;
-import java.util.regex.Pattern;
-
-public class PatternReplaceCharFilterFactory extends AbstractCharFilterFactory {
+public class PatternReplaceCharFilterFactory extends AbstractCharFilterFactory implements MultiTermAwareComponent {
private final Pattern pattern;
private final String replacement;
@@ -56,4 +56,9 @@ public class PatternReplaceCharFilterFactory extends AbstractCharFilterFactory {
public Reader create(Reader tokenStream) {
return new PatternReplaceCharFilter(pattern, replacement, tokenStream);
}
+
+ @Override
+ public Object getMultiTermComponent() {
+ return this;
+ }
}
diff --git a/core/src/main/java/org/elasticsearch/index/search/MatchQuery.java b/core/src/main/java/org/elasticsearch/index/search/MatchQuery.java
index 6374e15492..21d084d5d2 100644
--- a/core/src/main/java/org/elasticsearch/index/search/MatchQuery.java
+++ b/core/src/main/java/org/elasticsearch/index/search/MatchQuery.java
@@ -27,13 +27,18 @@ import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.BoostQuery;
import org.apache.lucene.search.FuzzyQuery;
-import org.apache.lucene.search.GraphQuery;
import org.apache.lucene.search.MultiPhraseQuery;
import org.apache.lucene.search.MultiTermQuery;
import org.apache.lucene.search.PhraseQuery;
+import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.SynonymQuery;
import org.apache.lucene.search.TermQuery;
+import org.apache.lucene.search.spans.SpanMultiTermQueryWrapper;
+import org.apache.lucene.search.spans.SpanNearQuery;
+import org.apache.lucene.search.spans.SpanOrQuery;
+import org.apache.lucene.search.spans.SpanQuery;
+import org.apache.lucene.search.spans.SpanTermQuery;
import org.apache.lucene.util.QueryBuilder;
import org.elasticsearch.ElasticsearchException;
import org.elasticsearch.common.Nullable;
@@ -49,7 +54,6 @@ import org.elasticsearch.index.query.QueryShardContext;
import org.elasticsearch.index.query.support.QueryParsers;
import java.io.IOException;
-import java.util.List;
public class MatchQuery {
@@ -318,17 +322,6 @@ public class MatchQuery {
public Query createPhrasePrefixQuery(String field, String queryText, int phraseSlop, int maxExpansions) {
final Query query = createFieldQuery(getAnalyzer(), Occur.MUST, field, queryText, true, phraseSlop);
- if (query instanceof GraphQuery) {
- // we have a graph query, convert inner queries to multi phrase prefix queries
- List<Query> oldQueries = ((GraphQuery) query).getQueries();
- Query[] queries = new Query[oldQueries.size()];
- for (int i = 0; i < queries.length; i++) {
- queries[i] = toMultiPhrasePrefix(oldQueries.get(i), phraseSlop, maxExpansions);
- }
-
- return new GraphQuery(queries);
- }
-
return toMultiPhrasePrefix(query, phraseSlop, maxExpansions);
}
@@ -340,6 +333,9 @@ public class MatchQuery {
boost *= bq.getBoost();
innerQuery = bq.getQuery();
}
+ if (query instanceof SpanQuery) {
+ return toSpanQueryPrefix((SpanQuery) query, boost);
+ }
final MultiPhrasePrefixQuery prefixQuery = new MultiPhrasePrefixQuery();
prefixQuery.setMaxExpansions(maxExpansions);
prefixQuery.setSlop(phraseSlop);
@@ -369,6 +365,33 @@ public class MatchQuery {
return query;
}
+ private Query toSpanQueryPrefix(SpanQuery query, float boost) {
+ if (query instanceof SpanTermQuery) {
+ SpanMultiTermQueryWrapper<PrefixQuery> ret =
+ new SpanMultiTermQueryWrapper<>(new PrefixQuery(((SpanTermQuery) query).getTerm()));
+ return boost == 1 ? ret : new BoostQuery(ret, boost);
+ } else if (query instanceof SpanNearQuery) {
+ SpanNearQuery spanNearQuery = (SpanNearQuery) query;
+ SpanQuery[] clauses = spanNearQuery.getClauses();
+ if (clauses[clauses.length-1] instanceof SpanTermQuery) {
+ clauses[clauses.length-1] = new SpanMultiTermQueryWrapper<>(
+ new PrefixQuery(((SpanTermQuery) clauses[clauses.length-1]).getTerm())
+ );
+ }
+ SpanNearQuery newQuery = new SpanNearQuery(clauses, spanNearQuery.getSlop(), spanNearQuery.isInOrder());
+ return boost == 1 ? newQuery : new BoostQuery(newQuery, boost);
+ } else if (query instanceof SpanOrQuery) {
+ SpanOrQuery orQuery = (SpanOrQuery) query;
+ SpanQuery[] clauses = new SpanQuery[orQuery.getClauses().length];
+ for (int i = 0; i < clauses.length; i++) {
+ clauses[i] = (SpanQuery) toSpanQueryPrefix(orQuery.getClauses()[i], 1);
+ }
+ return boost == 1 ? new SpanOrQuery(clauses) : new BoostQuery(new SpanOrQuery(clauses), boost);
+ } else {
+ return query;
+ }
+ }
+
public Query createCommonTermsQuery(String field, String queryText, Occur highFreqOccur, Occur lowFreqOccur, float
maxTermFrequency, MappedFieldType fieldType) {
Query booleanQuery = createBooleanQuery(field, queryText, lowFreqOccur);
diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/tophits/InternalTopHits.java b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/tophits/InternalTopHits.java
index 1b32e6e9de..d1986f2dd2 100644
--- a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/tophits/InternalTopHits.java
+++ b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/tophits/InternalTopHits.java
@@ -119,7 +119,7 @@ public class InternalTopHits extends InternalAggregation implements TopHits {
shardDocs[i] = topHitsAgg.topDocs;
shardHits[i] = topHitsAgg.searchHits;
}
- reducedTopDocs = TopDocs.merge(sort, from, size, (TopFieldDocs[]) shardDocs);
+ reducedTopDocs = TopDocs.merge(sort, from, size, (TopFieldDocs[]) shardDocs, true);
} else {
shardDocs = new TopDocs[aggregations.size()];
for (int i = 0; i < shardDocs.length; i++) {
@@ -127,7 +127,7 @@ public class InternalTopHits extends InternalAggregation implements TopHits {
shardDocs[i] = topHitsAgg.topDocs;
shardHits[i] = topHitsAgg.searchHits;
}
- reducedTopDocs = TopDocs.merge(from, size, shardDocs);
+ reducedTopDocs = TopDocs.merge(from, size, shardDocs, true);
}
final int[] tracker = new int[shardHits.length];
diff --git a/core/src/main/java/org/elasticsearch/search/profile/query/ProfileScorer.java b/core/src/main/java/org/elasticsearch/search/profile/query/ProfileScorer.java
index 51d0b14fc9..fa76608eb8 100644
--- a/core/src/main/java/org/elasticsearch/search/profile/query/ProfileScorer.java
+++ b/core/src/main/java/org/elasticsearch/search/profile/query/ProfileScorer.java
@@ -70,7 +70,7 @@ final class ProfileScorer extends Scorer {
}
@Override
- public Collection<ChildScorer> getChildren() {
+ public Collection<ChildScorer> getChildren() throws IOException {
return scorer.getChildren();
}
diff --git a/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggester.java b/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggester.java
index b048977741..abc8d209cd 100644
--- a/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggester.java
+++ b/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggester.java
@@ -184,8 +184,10 @@ public class CompletionSuggester extends Suggester<CompletionSuggestionContext>
private final SuggestDocPriorityQueue pq;
private final Map<Integer, SuggestDoc> scoreDocMap;
+ // TODO: expose dup removal
+
TopDocumentsCollector(int num) {
- super(1); // TODO hack, we don't use the underlying pq, so we allocate a size of 1
+ super(1, false); // TODO hack, we don't use the underlying pq, so we allocate a size of 1
this.num = num;
this.scoreDocMap = new LinkedHashMap<>(num);
this.pq = new SuggestDocPriorityQueue(num);