diff options
author | Christoph Büscher <christoph@elastic.co> | 2016-02-02 15:48:27 +0100 |
---|---|---|
committer | Ali Beyad <ali@elastic.co> | 2016-02-09 18:05:21 -0500 |
commit | e883febfb8cf466354a3b64c3cd2159061325de0 (patch) | |
tree | 5e81eefb3cc6fea22896f0f44b442e7bbb6a70c8 /core/src/main/java | |
parent | e82713ae4e10699b1d553a85b75087c2c635ad9a (diff) |
WIP adding build() method to PhraseSuggestionBuilder
Diffstat (limited to 'core/src/main/java')
16 files changed, 202 insertions, 50 deletions
diff --git a/core/src/main/java/org/elasticsearch/indices/query/IndicesQueriesRegistry.java b/core/src/main/java/org/elasticsearch/indices/query/IndicesQueriesRegistry.java index a9e90884a6..b0b212d2ab 100644 --- a/core/src/main/java/org/elasticsearch/indices/query/IndicesQueriesRegistry.java +++ b/core/src/main/java/org/elasticsearch/indices/query/IndicesQueriesRegistry.java @@ -19,12 +19,12 @@ package org.elasticsearch.indices.query; -import java.util.Map; - import org.elasticsearch.common.component.AbstractComponent; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.query.QueryParser; +import java.util.Map; + public class IndicesQueriesRegistry extends AbstractComponent { private Map<String, QueryParser<?>> queryParsers; diff --git a/core/src/main/java/org/elasticsearch/search/SearchService.java b/core/src/main/java/org/elasticsearch/search/SearchService.java index cf9c0cebce..ff6d8897d5 100644 --- a/core/src/main/java/org/elasticsearch/search/SearchService.java +++ b/core/src/main/java/org/elasticsearch/search/SearchService.java @@ -751,7 +751,7 @@ public class SearchService extends AbstractLifecycleComponent<SearchService> imp if (source.rescores() != null) { try { for (RescoreBuilder<?> rescore : source.rescores()) { - context.addRescore(rescore.build(context.getQueryShardContext())); + context.addRescore(rescore.build(queryShardContext)); } } catch (IOException e) { throw new SearchContextException(context, "failed to create RescoreSearchContext", e); @@ -776,7 +776,7 @@ public class SearchService extends AbstractLifecycleComponent<SearchService> imp if (source.highlighter() != null) { HighlightBuilder highlightBuilder = source.highlighter(); try { - context.highlight(highlightBuilder.build(context.getQueryShardContext())); + context.highlight(highlightBuilder.build(queryShardContext)); } catch (IOException e) { throw new SearchContextException(context, "failed to create SearchContextHighlighter", e); } diff --git a/core/src/main/java/org/elasticsearch/search/suggest/SuggestParseElement.java b/core/src/main/java/org/elasticsearch/search/suggest/SuggestParseElement.java index cf6b391ec6..52b728a476 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/SuggestParseElement.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/SuggestParseElement.java @@ -117,9 +117,6 @@ public final class SuggestParseElement implements SearchParseElement { for (Map.Entry<String, SuggestionContext> entry : suggestionContexts.entrySet()) { String suggestionName = entry.getKey(); SuggestionContext suggestionContext = entry.getValue(); - - suggestionContext.setShard(shardId); - suggestionContext.setIndex(index); SuggestUtils.verifySuggestion(mapperService, globalText, suggestionContext); suggestionSearchContext.addSuggestion(suggestionName, suggestionContext); } diff --git a/core/src/main/java/org/elasticsearch/search/suggest/SuggestUtils.java b/core/src/main/java/org/elasticsearch/search/suggest/SuggestUtils.java index 989546d50b..89cc8e2f01 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/SuggestUtils.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/SuggestUtils.java @@ -42,6 +42,7 @@ import org.apache.lucene.util.automaton.LevenshteinAutomata; import org.elasticsearch.common.ParseField; import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.io.FastCharArrayReader; +import org.elasticsearch.common.lucene.BytesRefs; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.analysis.CustomAnalyzer; import org.elasticsearch.index.analysis.NamedAnalyzer; @@ -271,9 +272,54 @@ public final class SuggestUtils { return false; } return true; - } + /** + * Transfers the text, prefix, regex, analyzer, fieldname, size and shard size settings from the + * original {@link SuggestionBuilder} to the target {@link SuggestionContext} + */ + public static void suggestionToSuggestionContext(SuggestionBuilder suggestionBuilder, MapperService mapperService, + SuggestionSearchContext.SuggestionContext suggestionContext) throws IOException { + String analyzerName = suggestionBuilder.analyzer(); + if (analyzerName != null) { + Analyzer analyzer = mapperService.analysisService().analyzer(analyzerName); + if (analyzer == null) { + throw new IllegalArgumentException("Analyzer [" + analyzerName + "] doesn't exists"); + } + suggestionContext.setAnalyzer(analyzer); + } + if (suggestionBuilder.field() != null) { + suggestionContext.setField(suggestionBuilder.field()); + } + if (suggestionBuilder.size() != null) { + suggestionContext.setSize(suggestionBuilder.size()); + } + if (suggestionBuilder.shardSize() != null) { + suggestionContext.setShardSize(suggestionBuilder.shardSize()); + } else { + // if no shard size is set in builder, use size (or at least 5) + suggestionContext.setShardSize(Math.max(suggestionContext.getSize(), 5)); + } + String text = suggestionBuilder.text(); + if (text != null) { + suggestionContext.setText(BytesRefs.toBytesRef(text)); + } + String prefix = suggestionBuilder.prefix(); + if (prefix != null) { + suggestionContext.setText(BytesRefs.toBytesRef(prefix)); + } + String regex = suggestionBuilder.regex(); + if (regex != null) { + suggestionContext.setText(BytesRefs.toBytesRef(regex)); + } + if (text != null && prefix == null) { + suggestionContext.setPrefix(BytesRefs.toBytesRef(text)); + } else if (text == null && prefix != null) { + suggestionContext.setText(BytesRefs.toBytesRef(prefix)); + } else if (text == null && regex != null) { + suggestionContext.setText(BytesRefs.toBytesRef(regex)); + } + } public static void verifySuggestion(MapperService mapperService, BytesRef globalText, SuggestionContext suggestion) { // Verify options and set defaults diff --git a/core/src/main/java/org/elasticsearch/search/suggest/Suggesters.java b/core/src/main/java/org/elasticsearch/search/suggest/Suggesters.java index c26649f638..dc6bb0613d 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/Suggesters.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/Suggesters.java @@ -54,7 +54,7 @@ public final class Suggesters extends ExtensionPoint.ClassMap<Suggester> { private static Map<String, Suggester> addBuildIns(Map<String, Suggester> suggesters, ScriptService scriptService, IndicesService indexServices) { final Map<String, Suggester> map = new HashMap<>(); - map.put("phrase", new PhraseSuggester(scriptService, indexServices)); + map.put("phrase", new PhraseSuggester(scriptService)); map.put("term", new TermSuggester()); map.put("completion", new CompletionSuggester()); map.putAll(suggesters); diff --git a/core/src/main/java/org/elasticsearch/search/suggest/SuggestionBuilder.java b/core/src/main/java/org/elasticsearch/search/suggest/SuggestionBuilder.java index 1fdb38df88..e1ecca1ccc 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/SuggestionBuilder.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/SuggestionBuilder.java @@ -28,6 +28,8 @@ import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.query.QueryParseContext; +import org.elasticsearch.index.query.QueryShardContext; +import org.elasticsearch.search.suggest.SuggestionSearchContext.SuggestionContext; import java.io.IOException; import java.util.Objects; @@ -192,7 +194,9 @@ public abstract class SuggestionBuilder<T extends SuggestionBuilder<T>> extends protected abstract SuggestionBuilder<T> innerFromXContent(QueryParseContext parseContext, String name) throws IOException; - private String getSuggesterName() { + protected abstract SuggestionContext build(QueryShardContext context) throws IOException; + + public String getSuggesterName() { //default impl returns the same as writeable name, but we keep the distinction between the two just to make sure return getWriteableName(); } diff --git a/core/src/main/java/org/elasticsearch/search/suggest/SuggestionSearchContext.java b/core/src/main/java/org/elasticsearch/search/suggest/SuggestionSearchContext.java index 1d3339e057..b662df33f2 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/SuggestionSearchContext.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/SuggestionSearchContext.java @@ -36,9 +36,9 @@ public class SuggestionSearchContext { public Map<String, SuggestionContext> suggestions() { return suggestions; } - + public static class SuggestionContext { - + private BytesRef text; private BytesRef prefix; private BytesRef regex; @@ -47,9 +47,7 @@ public class SuggestionSearchContext { private Analyzer analyzer; private int size = 5; private int shardSize = -1; - private int shardId; - private String index; - + public BytesRef getText() { return text; } @@ -119,22 +117,6 @@ public class SuggestionSearchContext { } this.shardSize = shardSize; } - - public void setShard(int shardId) { - this.shardId = shardId; - } - - public void setIndex(String index) { - this.index = index; - } - - public String getIndex() { - return index; - } - - public int getShard() { - return shardId; - } } } 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 8cd9d386a1..86f3b87b05 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 @@ -51,6 +51,8 @@ import java.util.Set; public class CompletionSuggester extends Suggester<CompletionSuggestionContext> { + static final CompletionSuggester PROTOTYPE = new CompletionSuggester(); + @Override public SuggestContextParser getContextParser() { return new CompletionSuggestParser(this); diff --git a/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionBuilder.java b/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionBuilder.java index 29992c1a07..0bd37be128 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionBuilder.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionBuilder.java @@ -28,8 +28,10 @@ import org.elasticsearch.common.unit.Fuzziness; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.index.query.QueryParseContext; +import org.elasticsearch.index.query.QueryShardContext; import org.elasticsearch.index.query.RegexpFlag; import org.elasticsearch.search.suggest.SuggestionBuilder; +import org.elasticsearch.search.suggest.SuggestionSearchContext.SuggestionContext; import org.elasticsearch.search.suggest.completion.context.CategoryQueryContext; import org.elasticsearch.search.suggest.completion.context.GeoQueryContext; @@ -372,10 +374,17 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug @Override protected CompletionSuggestionBuilder innerFromXContent(QueryParseContext parseContext, String name) throws IOException { + // NORELEASE return new CompletionSuggestionBuilder(name); } @Override + protected SuggestionContext build(QueryShardContext context) throws IOException { + // NORELEASE + throw new UnsupportedOperationException(); + } + + @Override public String getWriteableName() { return SUGGESTION_NAME; } diff --git a/core/src/main/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGeneratorBuilder.java b/core/src/main/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGeneratorBuilder.java index 8cc834ef0d..dd1be571bd 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGeneratorBuilder.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGeneratorBuilder.java @@ -30,7 +30,6 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.query.QueryParseContext; -import org.elasticsearch.index.query.QueryShardContext; import org.elasticsearch.search.suggest.SuggestUtils; import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder.CandidateGenerator; @@ -349,8 +348,7 @@ public final class DirectCandidateGeneratorBuilder return replaceField(tmpFieldName.iterator().next(), tempGenerator); } - public PhraseSuggestionContext.DirectCandidateGenerator build(QueryShardContext context) throws IOException { - MapperService mapperService = context.getMapperService(); + public PhraseSuggestionContext.DirectCandidateGenerator build(MapperService mapperService) throws IOException { PhraseSuggestionContext.DirectCandidateGenerator generator = new PhraseSuggestionContext.DirectCandidateGenerator(); generator.setField(this.field); transferIfNotNull(this.size, generator::size); diff --git a/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestParser.java b/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestParser.java index fc60fc6fc8..eb7254c722 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestParser.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestParser.java @@ -199,9 +199,6 @@ public final class PhraseSuggestParser implements SuggestContextParser { suggestion.addGenerator(generator); } } - - - return suggestion; } diff --git a/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggester.java b/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggester.java index fbfa2b03ce..74dcb33e64 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggester.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggester.java @@ -31,9 +31,7 @@ import org.apache.lucene.util.CharsRefBuilder; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.lucene.Lucene; import org.elasticsearch.common.text.Text; -import org.elasticsearch.index.IndexService; import org.elasticsearch.index.query.ParsedQuery; -import org.elasticsearch.indices.IndicesService; import org.elasticsearch.script.CompiledScript; import org.elasticsearch.script.ExecutableScript; import org.elasticsearch.script.ScriptService; @@ -55,11 +53,12 @@ public final class PhraseSuggester extends Suggester<PhraseSuggestionContext> { private final BytesRef SEPARATOR = new BytesRef(" "); private static final String SUGGESTION_TEMPLATE_VAR_NAME = "suggestion"; private final ScriptService scriptService; - private final IndicesService indicesService; - public PhraseSuggester(ScriptService scriptService, IndicesService indicesService) { + static PhraseSuggester PROTOTYPE; + + public PhraseSuggester(ScriptService scriptService) { this.scriptService = scriptService; - this.indicesService = indicesService; + PROTOTYPE = this; } /* @@ -120,8 +119,7 @@ public final class PhraseSuggester extends Suggester<PhraseSuggestionContext> { vars.put(SUGGESTION_TEMPLATE_VAR_NAME, spare.toString()); final ExecutableScript executable = scriptService.executable(collateScript, vars); final BytesReference querySource = (BytesReference) executable.run(); - IndexService indexService = indicesService.indexService(suggestion.getIndex()); - final ParsedQuery parsedQuery = indexService.newQueryShardContext().parse(querySource); + final ParsedQuery parsedQuery = suggestion.getShardContext().parse(querySource); collateMatch = Lucene.exists(searcher, parsedQuery.query()); } if (!collateMatch && !collatePrune) { diff --git a/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestionBuilder.java b/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestionBuilder.java index 2982012a2d..08a1a47b07 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestionBuilder.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestionBuilder.java @@ -29,17 +29,28 @@ import org.elasticsearch.common.io.stream.NamedWriteable; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Writeable; +import org.elasticsearch.common.lucene.BytesRefs; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentParser.Token; +import org.elasticsearch.index.analysis.ShingleTokenFilterFactory; +import org.elasticsearch.index.mapper.MappedFieldType; +import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.query.QueryParseContext; +import org.elasticsearch.index.query.QueryShardContext; +import org.elasticsearch.script.CompiledScript; +import org.elasticsearch.script.ScriptContext; import org.elasticsearch.script.Template; +import org.elasticsearch.search.suggest.SuggestUtils; import org.elasticsearch.search.suggest.SuggestionBuilder; +import org.elasticsearch.search.suggest.SuggestionSearchContext.SuggestionContext; +import org.elasticsearch.search.suggest.phrase.PhraseSuggestionContext.DirectCandidateGenerator; import org.elasticsearch.search.suggest.phrase.WordScorer.WordScorerFactory; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -254,6 +265,9 @@ public final class PhraseSuggestionBuilder extends SuggestionBuilder<PhraseSugge } public PhraseSuggestionBuilder tokenLimit(int tokenLimit) { + if (tokenLimit <= 0) { + throw new IllegalArgumentException("token_limit must be >= 1"); + } this.tokenLimit = tokenLimit; return this; } @@ -887,6 +901,101 @@ public final class PhraseSuggestionBuilder extends SuggestionBuilder<PhraseSugge return suggestion; } + + @Override + public SuggestionContext build(QueryShardContext context) throws IOException { + PhraseSuggestionContext suggestionContext = new PhraseSuggestionContext(PhraseSuggester.PROTOTYPE); + MapperService mapperService = context.getMapperService(); + suggestionContext.setShardContext(context); + + // copy common fields + SuggestUtils.suggestionToSuggestionContext(this, mapperService, suggestionContext); + + suggestionContext.setSeparator(BytesRefs.toBytesRef(this.separator)); + suggestionContext.setRealWordErrorLikelihood(this.realWordErrorLikelihood); + suggestionContext.setConfidence(this.confidence); + suggestionContext.setMaxErrors(this.maxErrors); + suggestionContext.setSeparator(BytesRefs.toBytesRef(this.separator)); + suggestionContext.setRequireUnigram(this.forceUnigrams); + suggestionContext.setTokenLimit(this.tokenLimit); + suggestionContext.setPreTag(BytesRefs.toBytesRef(this.preTag)); + suggestionContext.setPostTag(BytesRefs.toBytesRef(this.postTag)); + + if (this.gramSize != null) { + suggestionContext.setGramSize(this.gramSize); + } + + for (List<CandidateGenerator> candidateGenerators : this.generators.values()) { + for (CandidateGenerator candidateGenerator : candidateGenerators) { + suggestionContext.addGenerator(candidateGenerator.build(mapperService)); + } + } + + if (this.model != null) { + suggestionContext.setModel(this.model.buildWordScorerFactory()); + } + + if (this.collateQuery != null) { + CompiledScript compiledScript = context.getScriptService().compile(this.collateQuery, ScriptContext.Standard.SEARCH, + Collections.emptyMap()); + suggestionContext.setCollateQueryScript(compiledScript); + if (this.collateParams != null) { + suggestionContext.setCollateScriptParams(this.collateParams); + } + suggestionContext.setCollatePrune(this.collatePrune); + } + + // TODO make field mandatory in the builder, then remove this + if (suggestionContext.getField() == null) { + throw new IllegalArgumentException("The required field option is missing"); + } + + MappedFieldType fieldType = mapperService.fullName(suggestionContext.getField()); + if (fieldType == null) { + throw new IllegalArgumentException("No mapping found for field [" + suggestionContext.getField() + "]"); + } else if (suggestionContext.getAnalyzer() == null) { + // no analyzer name passed in, so try the field's analyzer, or the default analyzer + if (fieldType.searchAnalyzer() == null) { + suggestionContext.setAnalyzer(mapperService.searchAnalyzer()); + } else { + suggestionContext.setAnalyzer(fieldType.searchAnalyzer()); + } + } + + if (suggestionContext.model() == null) { + suggestionContext.setModel(StupidBackoffScorer.FACTORY); + } + + if (this.gramSize == null || suggestionContext.generators().isEmpty()) { + final ShingleTokenFilterFactory.Factory shingleFilterFactory = SuggestUtils + .getShingleFilterFactory(suggestionContext.getAnalyzer()); + if (this.gramSize == null) { + // try to detect the shingle size + if (shingleFilterFactory != null) { + suggestionContext.setGramSize(shingleFilterFactory.getMaxShingleSize()); + if (suggestionContext.getAnalyzer() == null && shingleFilterFactory.getMinShingleSize() > 1 + && !shingleFilterFactory.getOutputUnigrams()) { + throw new IllegalArgumentException("The default analyzer for field: [" + suggestionContext.getField() + + "] doesn't emit unigrams. If this is intentional try to set the analyzer explicitly"); + } + } + } + if (suggestionContext.generators().isEmpty()) { + if (shingleFilterFactory != null && shingleFilterFactory.getMinShingleSize() > 1 + && !shingleFilterFactory.getOutputUnigrams() && suggestionContext.getRequireUnigram()) { + throw new IllegalArgumentException("The default candidate generator for phrase suggest can't operate on field: [" + + suggestionContext.getField() + "] since it doesn't emit unigrams. " + + "If this is intentional try to set the candidate generator field explicitly"); + } + // use a default generator on the same field + DirectCandidateGenerator generator = new DirectCandidateGenerator(); + generator.setField(suggestionContext.getField()); + suggestionContext.addGenerator(generator); + } + } + return suggestionContext; + } + private static void ensureNoSmoothing(PhraseSuggestionBuilder suggestion) { if (suggestion.smoothingModel() != null) { throw new IllegalArgumentException("only one smoothing model supported"); @@ -999,5 +1108,7 @@ public final class PhraseSuggestionBuilder extends SuggestionBuilder<PhraseSugge String getType(); CandidateGenerator fromXContent(QueryParseContext parseContext) throws IOException; + + PhraseSuggestionContext.DirectCandidateGenerator build(MapperService mapperService) throws IOException; } } diff --git a/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestionContext.java b/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestionContext.java index 20af69b6a6..4b63c03f8e 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestionContext.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestionContext.java @@ -20,6 +20,7 @@ package org.elasticsearch.search.suggest.phrase; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.util.BytesRef; +import org.elasticsearch.index.query.QueryShardContext; import org.elasticsearch.script.CompiledScript; import org.elasticsearch.search.suggest.DirectSpellcheckerSettings; import org.elasticsearch.search.suggest.Suggester; @@ -53,6 +54,7 @@ class PhraseSuggestionContext extends SuggestionContext { private List<DirectCandidateGenerator> generators = new ArrayList<>(); private Map<String, Object> collateScriptParams = new HashMap<>(1); private WordScorer.WordScorerFactory scorer; + private QueryShardContext shardContext; public PhraseSuggestionContext(Suggester<? extends PhraseSuggestionContext> suggester) { super(suggester); @@ -214,4 +216,12 @@ class PhraseSuggestionContext extends SuggestionContext { return prune; } + public void setShardContext(QueryShardContext context) { + this.shardContext = context; + } + + public QueryShardContext getShardContext() { + return this.shardContext; + } + } diff --git a/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggester.java b/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggester.java index e67e619bf5..37ec73711a 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggester.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggester.java @@ -40,6 +40,8 @@ import java.util.List; public final class TermSuggester extends Suggester<TermSuggestionContext> { + static final TermSuggester PROTOTYPE = new TermSuggester(); + @Override public TermSuggestion innerExecute(String name, TermSuggestionContext suggestion, IndexSearcher searcher, CharsRefBuilder spare) throws IOException { diff --git a/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestionBuilder.java b/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestionBuilder.java index 7625f204c0..1f190b674a 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestionBuilder.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestionBuilder.java @@ -19,12 +19,6 @@ package org.elasticsearch.search.suggest.term; -import org.apache.lucene.search.spell.DirectSpellChecker; -import org.apache.lucene.search.spell.JaroWinklerDistance; -import org.apache.lucene.search.spell.LevensteinDistance; -import org.apache.lucene.search.spell.LuceneLevenshteinDistance; -import org.apache.lucene.search.spell.NGramDistance; -import org.apache.lucene.search.spell.StringDistance; import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; @@ -32,7 +26,9 @@ import org.elasticsearch.common.io.stream.Writeable; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.query.QueryParseContext; +import org.elasticsearch.index.query.QueryShardContext; import org.elasticsearch.search.suggest.SuggestionBuilder; +import org.elasticsearch.search.suggest.SuggestionSearchContext.SuggestionContext; import java.io.IOException; import java.util.Locale; |