summaryrefslogtreecommitdiff
path: root/core/src/main/java/org
diff options
context:
space:
mode:
authorChristoph Büscher <christoph@elastic.co>2016-02-02 15:48:27 +0100
committerAli Beyad <ali@elastic.co>2016-02-09 18:05:21 -0500
commite883febfb8cf466354a3b64c3cd2159061325de0 (patch)
tree5e81eefb3cc6fea22896f0f44b442e7bbb6a70c8 /core/src/main/java/org
parente82713ae4e10699b1d553a85b75087c2c635ad9a (diff)
WIP adding build() method to PhraseSuggestionBuilder
Diffstat (limited to 'core/src/main/java/org')
-rw-r--r--core/src/main/java/org/elasticsearch/indices/query/IndicesQueriesRegistry.java4
-rw-r--r--core/src/main/java/org/elasticsearch/search/SearchService.java4
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/SuggestParseElement.java3
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/SuggestUtils.java48
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/Suggesters.java2
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/SuggestionBuilder.java6
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/SuggestionSearchContext.java24
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggester.java2
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionBuilder.java9
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGeneratorBuilder.java4
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestParser.java3
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggester.java12
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestionBuilder.java111
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestionContext.java10
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggester.java2
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestionBuilder.java8
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;