diff options
author | Jim Ferenczi <jim.ferenczi@elastic.co> | 2017-02-27 18:39:04 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-02-27 18:39:04 +0100 |
commit | 5c84640126e66de68f6e742ccb1a9d351f638fd4 (patch) | |
tree | 37f88eb250a94681c0e3083e7e539334975d6073 /core/src/main/java/org | |
parent | 48280a940379e5ba7839c9dd2d1483951855473a (diff) |
Upgrade to lucene-6.5.0-snapshot-d00c5ca (#23385)
Lucene upgrade
Diffstat (limited to 'core/src/main/java/org')
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); |