summaryrefslogtreecommitdiff
path: root/core/src/main/java/org
diff options
context:
space:
mode:
authorAreek Zillur <areek.zillur@elasticsearch.com>2016-03-11 16:27:33 -0500
committerAreek Zillur <areek.zillur@elasticsearch.com>2016-03-11 16:27:33 -0500
commit4b803d75cf3d06faa0bb81472ca09564406c70c0 (patch)
treea6655e455f24e94973581ee8963857020e6df795 /core/src/main/java/org
parent97e2bab4cd1214a3fa69d914ae1d3becb2de1bbd (diff)
nuke SuggestParseElement
Diffstat (limited to 'core/src/main/java/org')
-rw-r--r--core/src/main/java/org/elasticsearch/search/SearchService.java5
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/SuggestContextParser.java29
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/SuggestParseElement.java136
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/SuggestPhase.java16
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/Suggester.java7
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/Suggesters.java6
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestParser.java143
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggester.java6
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionBuilder.java52
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/completion/FuzzyOptions.java10
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/completion/RegexOptions.java6
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGenerator.java2
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestParser.java356
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggester.java6
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/phrase/WordScorer.java14
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestParser.java68
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggester.java7
17 files changed, 63 insertions, 806 deletions
diff --git a/core/src/main/java/org/elasticsearch/search/SearchService.java b/core/src/main/java/org/elasticsearch/search/SearchService.java
index 463e6d3e55..2e4dc15021 100644
--- a/core/src/main/java/org/elasticsearch/search/SearchService.java
+++ b/core/src/main/java/org/elasticsearch/search/SearchService.java
@@ -794,6 +794,11 @@ public class SearchService extends AbstractLifecycleComponent<SearchService> imp
} else {
SearchParseElement parseElement = this.elementParsers.get(currentFieldName);
if (parseElement == null) {
+ if (currentFieldName != null && currentFieldName.equals("suggest")) {
+ throw new SearchParseException(context,
+ "suggest is not supported in [ext], please use SearchSourceBuilder#suggest(SuggestBuilder) instead",
+ extParser.getTokenLocation());
+ }
throw new SearchParseException(context, "Unknown element [" + currentFieldName + "] in [ext]",
extParser.getTokenLocation());
} else {
diff --git a/core/src/main/java/org/elasticsearch/search/suggest/SuggestContextParser.java b/core/src/main/java/org/elasticsearch/search/suggest/SuggestContextParser.java
deleted file mode 100644
index 53d510bf53..0000000000
--- a/core/src/main/java/org/elasticsearch/search/suggest/SuggestContextParser.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to Elasticsearch under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.elasticsearch.search.suggest;
-
-import org.elasticsearch.common.xcontent.XContentParser;
-import org.elasticsearch.index.query.QueryShardContext;
-
-import java.io.IOException;
-
-public interface SuggestContextParser {
- SuggestionSearchContext.SuggestionContext parse(XContentParser parser, QueryShardContext shardContext) throws IOException;
-
-}
diff --git a/core/src/main/java/org/elasticsearch/search/suggest/SuggestParseElement.java b/core/src/main/java/org/elasticsearch/search/suggest/SuggestParseElement.java
deleted file mode 100644
index b9454dc264..0000000000
--- a/core/src/main/java/org/elasticsearch/search/suggest/SuggestParseElement.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Licensed to Elasticsearch under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.elasticsearch.search.suggest;
-
-import org.apache.lucene.util.BytesRef;
-import org.elasticsearch.common.inject.Inject;
-import org.elasticsearch.common.xcontent.XContentParser;
-import org.elasticsearch.index.mapper.MapperService;
-import org.elasticsearch.index.query.QueryShardContext;
-import org.elasticsearch.search.SearchParseElement;
-import org.elasticsearch.search.internal.SearchContext;
-import org.elasticsearch.search.suggest.SuggestionSearchContext.SuggestionContext;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- *
- */
-public final class SuggestParseElement implements SearchParseElement {
- private Suggesters suggesters;
-
- @Inject
- public SuggestParseElement(Suggesters suggesters) {
- this.suggesters = suggesters;
- }
-
- @Override
- public void parse(XContentParser parser, SearchContext context) throws Exception {
- SuggestionSearchContext suggestionSearchContext = parseInternal(parser, context.getQueryShardContext());
- context.suggest(suggestionSearchContext);
- }
-
- public SuggestionSearchContext parseInternal(XContentParser parser, QueryShardContext shardContext) throws IOException {
- SuggestionSearchContext suggestionSearchContext = new SuggestionSearchContext();
- MapperService mapperService = shardContext.getMapperService();
-
- BytesRef globalText = null;
- String fieldName = null;
- Map<String, SuggestionContext> suggestionContexts = new HashMap<>();
-
- XContentParser.Token token;
- while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
- if (token == XContentParser.Token.FIELD_NAME) {
- fieldName = parser.currentName();
- } else if (token.isValue()) {
- if ("text".equals(fieldName)) {
- globalText = parser.utf8Bytes();
- } else {
- throw new IllegalArgumentException("[suggest] does not support [" + fieldName + "]");
- }
- } else if (token == XContentParser.Token.START_OBJECT) {
- String suggestionName = fieldName;
- BytesRef suggestText = null;
- BytesRef prefix = null;
- BytesRef regex = null;
- SuggestionContext suggestionContext = null;
-
- while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
- if (token == XContentParser.Token.FIELD_NAME) {
- fieldName = parser.currentName();
- } else if (token.isValue()) {
- if ("text".equals(fieldName)) {
- suggestText = parser.utf8Bytes();
- } else if ("prefix".equals(fieldName)) {
- prefix = parser.utf8Bytes();
- } else if ("regex".equals(fieldName)) {
- regex = parser.utf8Bytes();
- } else {
- throw new IllegalArgumentException("[suggest] does not support [" + fieldName + "]");
- }
- } else if (token == XContentParser.Token.START_OBJECT) {
- if (suggestionName == null) {
- throw new IllegalArgumentException("Suggestion must have name");
- }
- if (suggesters.get(fieldName) == null) {
- throw new IllegalArgumentException("Suggester[" + fieldName + "] not supported");
- }
- final SuggestContextParser contextParser = suggesters.get(fieldName).getContextParser();
- suggestionContext = contextParser.parse(parser, shardContext);
- }
- }
- if (suggestionContext != null) {
- if (suggestText != null) {
- suggestionContext.setText(suggestText);
- }
- if (prefix != null) {
- suggestionContext.setPrefix(prefix);
- }
- if (regex != null) {
- suggestionContext.setRegex(regex);
- }
-
- if (suggestText != null && prefix == null) {
- suggestionContext.setPrefix(suggestText);
- suggestionContext.setText(suggestText);
- } else if (suggestText == null && prefix != null) {
- suggestionContext.setPrefix(prefix);
- suggestionContext.setText(prefix);
- } else if (regex != null) {
- suggestionContext.setRegex(regex);
- suggestionContext.setText(regex);
- }
- suggestionContexts.put(suggestionName, suggestionContext);
- } else {
- throw new IllegalArgumentException("suggestion context could not be parsed correctly");
- }
- }
- }
-
- for (Map.Entry<String, SuggestionContext> entry : suggestionContexts.entrySet()) {
- String suggestionName = entry.getKey();
- SuggestionContext suggestionContext = entry.getValue();
- SuggestUtils.verifySuggestion(mapperService, globalText, suggestionContext);
- suggestionSearchContext.addSuggestion(suggestionName, suggestionContext);
- }
- return suggestionSearchContext;
- }
-}
diff --git a/core/src/main/java/org/elasticsearch/search/suggest/SuggestPhase.java b/core/src/main/java/org/elasticsearch/search/suggest/SuggestPhase.java
index 541efa7ef4..29c7343f04 100644
--- a/core/src/main/java/org/elasticsearch/search/suggest/SuggestPhase.java
+++ b/core/src/main/java/org/elasticsearch/search/suggest/SuggestPhase.java
@@ -37,28 +37,22 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import static java.util.Collections.singletonMap;
+import static java.util.Collections.emptyMap;
/**
*/
public class SuggestPhase extends AbstractComponent implements SearchPhase {
- private final Map<String, SearchParseElement> parseElements;
- private final SuggestParseElement parseElement;
@Inject
- public SuggestPhase(Settings settings, SuggestParseElement suggestParseElement) {
+ public SuggestPhase(Settings settings) {
super(settings);
- this.parseElement = suggestParseElement;
- parseElements = singletonMap("suggest", parseElement);
}
@Override
public Map<String, ? extends SearchParseElement> parseElements() {
- return parseElements;
- }
-
- public SuggestParseElement parseElement() {
- return parseElement;
+ // this is used to parse SearchSourceBuilder.ext() bytes
+ // we don't allow any suggestion parsing for the extension
+ return emptyMap();
}
@Override
diff --git a/core/src/main/java/org/elasticsearch/search/suggest/Suggester.java b/core/src/main/java/org/elasticsearch/search/suggest/Suggester.java
index b9bf603f1c..5772f2b55d 100644
--- a/core/src/main/java/org/elasticsearch/search/suggest/Suggester.java
+++ b/core/src/main/java/org/elasticsearch/search/suggest/Suggester.java
@@ -30,13 +30,6 @@ public abstract class Suggester<T extends SuggestionSearchContext.SuggestionCont
innerExecute(String name, T suggestion, IndexSearcher searcher, CharsRefBuilder spare) throws IOException;
/**
- * link the suggester to its corresponding {@link SuggestContextParser}
- * TODO: This method should eventually be removed by {@link #getBuilderPrototype()} once
- * we don't directly parse from xContent to the SuggestionContext any more
- */
- public abstract SuggestContextParser getContextParser();
-
- /**
* link the suggester to its corresponding {@link SuggestionBuilder}
*/
public abstract SuggestionBuilder<? extends SuggestionBuilder> getBuilderPrototype();
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 0bce98c720..644d9239b8 100644
--- a/core/src/main/java/org/elasticsearch/search/suggest/Suggesters.java
+++ b/core/src/main/java/org/elasticsearch/search/suggest/Suggesters.java
@@ -42,7 +42,7 @@ public final class Suggesters extends ExtensionPoint.ClassMap<Suggester> {
@Inject
public Suggesters(Map<String, Suggester> suggesters) {
- super("suggester", Suggester.class, new HashSet<>(Arrays.asList("phrase", "term", "completion")), Suggesters.class, SuggestParseElement.class, SuggestPhase.class);
+ super("suggester", Suggester.class, new HashSet<>(Arrays.asList("phrase", "term", "completion")), Suggesters.class, SuggestPhase.class);
this.parsers = Collections.unmodifiableMap(addBuildIns(suggesters));
}
@@ -55,10 +55,6 @@ public final class Suggesters extends ExtensionPoint.ClassMap<Suggester> {
return map;
}
- public Suggester get(String type) {
- return parsers.get(type);
- }
-
public SuggestionBuilder<? extends SuggestionBuilder> getSuggestionPrototype(String suggesterName) {
Suggester<?> suggester = parsers.get(suggesterName);
if (suggester == null) {
diff --git a/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestParser.java b/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestParser.java
deleted file mode 100644
index e5b70db699..0000000000
--- a/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestParser.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Licensed to Elasticsearch under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.elasticsearch.search.suggest.completion;
-
-import org.apache.lucene.analysis.Analyzer;
-import org.elasticsearch.ElasticsearchException;
-import org.elasticsearch.common.bytes.BytesReference;
-import org.elasticsearch.common.xcontent.ObjectParser;
-import org.elasticsearch.common.xcontent.XContentBuilder;
-import org.elasticsearch.common.xcontent.XContentFactory;
-import org.elasticsearch.common.xcontent.XContentParser;
-import org.elasticsearch.index.mapper.MappedFieldType;
-import org.elasticsearch.index.mapper.MapperService;
-import org.elasticsearch.index.mapper.core.CompletionFieldMapper;
-import org.elasticsearch.index.query.QueryShardContext;
-import org.elasticsearch.index.query.RegexpFlag;
-import org.elasticsearch.search.suggest.SuggestContextParser;
-import org.elasticsearch.search.suggest.SuggestUtils.Fields;
-import org.elasticsearch.search.suggest.SuggestionSearchContext;
-
-import java.io.IOException;
-
-/**
- * Parses query options for {@link CompletionSuggester}
- *
- * Acceptable input:
- * {
- * "field" : STRING
- * "size" : INT
- * "fuzzy" : BOOLEAN | FUZZY_OBJECT
- * "contexts" : QUERY_CONTEXTS
- * "regex" : REGEX_OBJECT
- * }
- *
- * FUZZY_OBJECT : {
- * "edit_distance" : STRING | INT
- * "transpositions" : BOOLEAN
- * "min_length" : INT
- * "prefix_length" : INT
- * "unicode_aware" : BOOLEAN
- * "max_determinized_states" : INT
- * }
- *
- * REGEX_OBJECT: {
- * "flags" : REGEX_FLAGS
- * "max_determinized_states" : INT
- * }
- *
- * see {@link RegexpFlag} for REGEX_FLAGS
- */
-public class CompletionSuggestParser implements SuggestContextParser {
-
- private static ObjectParser<CompletionSuggestionContext, ContextAndSuggest> TLP_PARSER = new ObjectParser<>(CompletionSuggestionBuilder.SUGGESTION_NAME, null);
- static {
- TLP_PARSER.declareStringArray(CompletionSuggestionContext::setPayloadFields, CompletionSuggestionBuilder.PAYLOAD_FIELD);
- TLP_PARSER.declareField((parser, completionSuggestionContext, context) -> {
- if (parser.currentToken() == XContentParser.Token.VALUE_BOOLEAN) {
- if (parser.booleanValue()) {
- completionSuggestionContext.setFuzzyOptions(new FuzzyOptions.Builder().build());
- }
- } else {
- completionSuggestionContext.setFuzzyOptions(FuzzyOptions.parse(parser));
- }
- },
- FuzzyOptions.FUZZY_OPTIONS, ObjectParser.ValueType.OBJECT_OR_BOOLEAN);
- TLP_PARSER.declareField((parser, completionSuggestionContext, context) -> completionSuggestionContext.setRegexOptions(RegexOptions.parse(parser)),
- RegexOptions.REGEX_OPTIONS, ObjectParser.ValueType.OBJECT);
- TLP_PARSER.declareString(SuggestionSearchContext.SuggestionContext::setField, Fields.FIELD);
- TLP_PARSER.declareField((p, v, c) -> {
- String analyzerName = p.text();
- Analyzer analyzer = c.mapperService.analysisService().analyzer(analyzerName);
- if (analyzer == null) {
- throw new IllegalArgumentException("Analyzer [" + analyzerName + "] doesn't exists");
- }
- v.setAnalyzer(analyzer);
- }, Fields.ANALYZER, ObjectParser.ValueType.STRING);
- TLP_PARSER.declareInt(SuggestionSearchContext.SuggestionContext::setSize, Fields.SIZE);
- TLP_PARSER.declareInt(SuggestionSearchContext.SuggestionContext::setShardSize, Fields.SHARD_SIZE);
- TLP_PARSER.declareField((p, v, c) -> {
- // Copy the current structure. We will parse, once the mapping is provided
- XContentBuilder builder = XContentFactory.contentBuilder(p.contentType());
- builder.copyCurrentStructure(p);
- BytesReference bytes = builder.bytes();
- c.contextParser = XContentFactory.xContent(bytes).createParser(bytes);
- p.skipChildren();
- }, CompletionSuggestionBuilder.CONTEXTS_FIELD, ObjectParser.ValueType.OBJECT); // context is deprecated
- }
-
- private static class ContextAndSuggest {
- XContentParser contextParser;
- final MapperService mapperService;
-
- ContextAndSuggest(MapperService mapperService) {
- this.mapperService = mapperService;
- }
- }
-
- private final CompletionSuggester completionSuggester;
-
- public CompletionSuggestParser(CompletionSuggester completionSuggester) {
- this.completionSuggester = completionSuggester;
- }
-
- @Override
- public SuggestionSearchContext.SuggestionContext parse(XContentParser parser, QueryShardContext shardContext) throws IOException {
- MapperService mapperService = shardContext.getMapperService();
- final CompletionSuggestionContext suggestion = new CompletionSuggestionContext(shardContext);
- final ContextAndSuggest contextAndSuggest = new ContextAndSuggest(mapperService);
- TLP_PARSER.parse(parser, suggestion, contextAndSuggest);
- final XContentParser contextParser = contextAndSuggest.contextParser;
- MappedFieldType mappedFieldType = mapperService.fullName(suggestion.getField());
- if (mappedFieldType == null) {
- throw new ElasticsearchException("Field [" + suggestion.getField() + "] is not a completion suggest field");
- } else if (mappedFieldType instanceof CompletionFieldMapper.CompletionFieldType) {
- CompletionFieldMapper.CompletionFieldType type = (CompletionFieldMapper.CompletionFieldType) mappedFieldType;
- if (type.hasContextMappings() == false && contextParser != null) {
- throw new IllegalArgumentException("suggester [" + type.name() + "] doesn't expect any context");
- }
- suggestion.setQueryContexts(CompletionSuggestionBuilder.parseQueryContexts(contextParser, type));
- suggestion.setFieldType(type);
- return suggestion;
- } else {
- throw new IllegalArgumentException("Field [" + suggestion.getField() + "] is not a completion suggest field");
- }
- }
-
-}
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 e3953c8e0b..cef0a33fdd 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
@@ -38,7 +38,6 @@ import org.elasticsearch.index.mapper.MapperService;
import org.elasticsearch.index.mapper.core.CompletionFieldMapper;
import org.elasticsearch.index.query.QueryShardContext;
import org.elasticsearch.search.suggest.Suggest;
-import org.elasticsearch.search.suggest.SuggestContextParser;
import org.elasticsearch.search.suggest.Suggester;
import org.elasticsearch.search.suggest.SuggestionBuilder;
@@ -56,11 +55,6 @@ public class CompletionSuggester extends Suggester<CompletionSuggestionContext>
public static final CompletionSuggester PROTOTYPE = new CompletionSuggester();
@Override
- public SuggestContextParser getContextParser() {
- return new CompletionSuggestParser(this);
- }
-
- @Override
protected Suggest.Suggestion<? extends Suggest.Suggestion.Entry<? extends Suggest.Suggestion.Entry.Option>> innerExecute(String name,
final CompletionSuggestionContext suggestionContext, final IndexSearcher searcher, CharsRefBuilder spare) throws IOException {
final CompletionFieldMapper.CompletionFieldType fieldType = suggestionContext.getFieldType();
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 7244c544cf..ca8aad7c8a 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
@@ -63,6 +63,16 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug
static final ParseField PAYLOAD_FIELD = new ParseField("payload");
static final ParseField CONTEXTS_FIELD = new ParseField("contexts", "context");
+ /**
+ * {
+ * "field" : STRING
+ * "size" : INT
+ * "fuzzy" : BOOLEAN | FUZZY_OBJECT
+ * "contexts" : QUERY_CONTEXTS
+ * "regex" : REGEX_OBJECT
+ * "payload" : STRING_ARRAY
+ * }
+ */
private static ObjectParser<CompletionSuggestionBuilder.InnerBuilder, Void> TLP_PARSER =
new ObjectParser<>(SUGGESTION_NAME, null);
static {
@@ -261,8 +271,24 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug
CompletionFieldMapper.CompletionFieldType type = (CompletionFieldMapper.CompletionFieldType) mappedFieldType;
suggestionContext.setFieldType(type);
if (type.hasContextMappings() && contextBytes != null) {
- XContentParser contextParser = XContentFactory.xContent(contextBytes).createParser(contextBytes);
- suggestionContext.setQueryContexts(parseQueryContexts(contextParser, type));
+ try (XContentParser contextParser = XContentFactory.xContent(contextBytes).createParser(contextBytes)) {
+ if (type.hasContextMappings() && contextParser != null) {
+ ContextMappings contextMappings = type.getContextMappings();
+ contextParser.nextToken();
+ Map<String, List<ContextMapping.InternalQueryContext>> queryContexts = new HashMap<>(contextMappings.size());
+ assert contextParser.currentToken() == XContentParser.Token.START_OBJECT;
+ XContentParser.Token currentToken;
+ String currentFieldName;
+ while ((currentToken = contextParser.nextToken()) != XContentParser.Token.END_OBJECT) {
+ if (currentToken == XContentParser.Token.FIELD_NAME) {
+ currentFieldName = contextParser.currentName();
+ final ContextMapping mapping = contextMappings.get(currentFieldName);
+ queryContexts.put(currentFieldName, mapping.parseQueryContext(contextParser));
+ }
+ }
+ suggestionContext.setQueryContexts(queryContexts);
+ }
+ }
} else if (contextBytes != null) {
throw new IllegalArgumentException("suggester [" + type.name() + "] doesn't expect any context");
}
@@ -335,26 +361,4 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug
protected int doHashCode() {
return Objects.hash(payloadFields, fuzzyOptions, regexOptions, contextBytes);
}
-
- static Map<String, List<ContextMapping.InternalQueryContext>> parseQueryContexts(
- XContentParser contextParser, CompletionFieldMapper.CompletionFieldType type) throws IOException {
- Map<String, List<ContextMapping.InternalQueryContext>> queryContexts = Collections.emptyMap();
- if (type.hasContextMappings() && contextParser != null) {
- ContextMappings contextMappings = type.getContextMappings();
- contextParser.nextToken();
- queryContexts = new HashMap<>(contextMappings.size());
- assert contextParser.currentToken() == XContentParser.Token.START_OBJECT;
- XContentParser.Token currentToken;
- String currentFieldName;
- while ((currentToken = contextParser.nextToken()) != XContentParser.Token.END_OBJECT) {
- if (currentToken == XContentParser.Token.FIELD_NAME) {
- currentFieldName = contextParser.currentName();
- final ContextMapping mapping = contextMappings.get(currentFieldName);
- queryContexts.put(currentFieldName, mapping.parseQueryContext(contextParser));
- }
- }
- contextParser.close();
- }
- return queryContexts;
- }
}
diff --git a/core/src/main/java/org/elasticsearch/search/suggest/completion/FuzzyOptions.java b/core/src/main/java/org/elasticsearch/search/suggest/completion/FuzzyOptions.java
index 709124443b..8f05be0469 100644
--- a/core/src/main/java/org/elasticsearch/search/suggest/completion/FuzzyOptions.java
+++ b/core/src/main/java/org/elasticsearch/search/suggest/completion/FuzzyOptions.java
@@ -46,6 +46,16 @@ public class FuzzyOptions implements ToXContent, Writeable<FuzzyOptions> {
private static final ParseField UNICODE_AWARE_FIELD = new ParseField("unicode_aware");
private static final ParseField MAX_DETERMINIZED_STATES_FIELD = new ParseField("max_determinized_states");
+ /**
+ * fuzzy : {
+ * "edit_distance" : STRING | INT
+ * "transpositions" : BOOLEAN
+ * "min_length" : INT
+ * "prefix_length" : INT
+ * "unicode_aware" : BOOLEAN
+ * "max_determinized_states" : INT
+ * }
+ */
private static ObjectParser<Builder, Void> PARSER = new ObjectParser<>(FUZZY_OPTIONS.getPreferredName(), Builder::new);
static {
PARSER.declareInt(Builder::setFuzzyMinLength, MIN_LENGTH_FIELD);
diff --git a/core/src/main/java/org/elasticsearch/search/suggest/completion/RegexOptions.java b/core/src/main/java/org/elasticsearch/search/suggest/completion/RegexOptions.java
index 81e524d6e3..8503dbdf46 100644
--- a/core/src/main/java/org/elasticsearch/search/suggest/completion/RegexOptions.java
+++ b/core/src/main/java/org/elasticsearch/search/suggest/completion/RegexOptions.java
@@ -42,6 +42,12 @@ public class RegexOptions implements ToXContent, Writeable<RegexOptions> {
private static final ParseField FLAGS_VALUE = new ParseField("flags", "flags_value");
private static final ParseField MAX_DETERMINIZED_STATES = new ParseField("max_determinized_states");
+ /**
+ * regex: {
+ * "flags" : STRING | INT
+ * "max_determinized_states" : INT
+ * }
+ */
private static ObjectParser<Builder, Void> PARSER = new ObjectParser<>(REGEX_OPTIONS.getPreferredName(), Builder::new);
static {
PARSER.declareInt(Builder::setMaxDeterminizedStates, MAX_DETERMINIZED_STATES);
diff --git a/core/src/main/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGenerator.java b/core/src/main/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGenerator.java
index 5b937500d6..a454735ae1 100644
--- a/core/src/main/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGenerator.java
+++ b/core/src/main/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGenerator.java
@@ -178,7 +178,7 @@ public final class DirectCandidateGenerator extends CandidateGenerator {
protected long thresholdFrequency(long termFrequency, long dictionarySize) {
if (termFrequency > 0) {
- return (long) Math.max(0, Math.round(termFrequency * (Math.log10(termFrequency - frequencyPlateau) * (1.0 / Math.log10(logBase))) + 1));
+ return Math.max(0, Math.round(termFrequency * (Math.log10(termFrequency - frequencyPlateau) * (1.0 / Math.log10(logBase))) + 1));
}
return 0;
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
deleted file mode 100644
index e4400fb5cd..0000000000
--- a/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestParser.java
+++ /dev/null
@@ -1,356 +0,0 @@
-/*
- * Licensed to Elasticsearch under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.elasticsearch.search.suggest.phrase;
-
-import org.apache.lucene.analysis.Analyzer;
-import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.Terms;
-import org.apache.lucene.util.BytesRef;
-import org.elasticsearch.common.ParseFieldMatcher;
-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.QueryShardContext;
-import org.elasticsearch.script.CompiledScript;
-import org.elasticsearch.script.ScriptContext;
-import org.elasticsearch.script.ScriptService;
-import org.elasticsearch.script.Template;
-import org.elasticsearch.search.suggest.SuggestContextParser;
-import org.elasticsearch.search.suggest.SuggestUtils;
-import org.elasticsearch.search.suggest.SuggestionSearchContext;
-import org.elasticsearch.search.suggest.phrase.PhraseSuggestionContext.DirectCandidateGenerator;
-
-import java.io.IOException;
-import java.util.Collections;
-
-public final class PhraseSuggestParser implements SuggestContextParser {
-
- private PhraseSuggester suggester;
-
- public PhraseSuggestParser(PhraseSuggester suggester) {
- this.suggester = suggester;
- }
-
- @Override
- public SuggestionSearchContext.SuggestionContext parse(XContentParser parser, QueryShardContext shardContext) throws IOException {
- MapperService mapperService = shardContext.getMapperService();
- ScriptService scriptService = shardContext.getScriptService();
- PhraseSuggestionContext suggestion = new PhraseSuggestionContext(shardContext);
- ParseFieldMatcher parseFieldMatcher = mapperService.getIndexSettings().getParseFieldMatcher();
- XContentParser.Token token;
- String fieldName = null;
- boolean gramSizeSet = false;
- while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
- if (token == XContentParser.Token.FIELD_NAME) {
- fieldName = parser.currentName();
- } else if (token.isValue()) {
- if (!SuggestUtils.parseSuggestContext(parser, mapperService, fieldName, suggestion, parseFieldMatcher)) {
- if ("real_word_error_likelihood".equals(fieldName) || "realWorldErrorLikelihood".equals(fieldName)) {
- suggestion.setRealWordErrorLikelihood(parser.floatValue());
- if (suggestion.realworldErrorLikelyhood() <= 0.0) {
- throw new IllegalArgumentException("real_word_error_likelihood must be > 0.0");
- }
- } else if ("confidence".equals(fieldName)) {
- suggestion.setConfidence(parser.floatValue());
- if (suggestion.confidence() < 0.0) {
- throw new IllegalArgumentException("confidence must be >= 0.0");
- }
- } else if ("separator".equals(fieldName)) {
- suggestion.setSeparator(new BytesRef(parser.text()));
- } else if ("max_errors".equals(fieldName) || "maxErrors".equals(fieldName)) {
- suggestion.setMaxErrors(parser.floatValue());
- if (suggestion.maxErrors() <= 0.0) {
- throw new IllegalArgumentException("max_error must be > 0.0");
- }
- } else if ("gram_size".equals(fieldName) || "gramSize".equals(fieldName)) {
- suggestion.setGramSize(parser.intValue());
- if (suggestion.gramSize() < 1) {
- throw new IllegalArgumentException("gram_size must be >= 1");
- }
- gramSizeSet = true;
- } else if ("force_unigrams".equals(fieldName) || "forceUnigrams".equals(fieldName)) {
- suggestion.setRequireUnigram(parser.booleanValue());
- } else if ("token_limit".equals(fieldName) || "tokenLimit".equals(fieldName)) {
- int tokenLimit = parser.intValue();
- if (tokenLimit <= 0) {
- throw new IllegalArgumentException("token_limit must be >= 1");
- }
- suggestion.setTokenLimit(tokenLimit);
- } else {
- throw new IllegalArgumentException("suggester[phrase] doesn't support field [" + fieldName + "]");
- }
- }
- } else if (token == Token.START_ARRAY) {
- if (parseFieldMatcher.match(fieldName, DirectCandidateGeneratorBuilder.DIRECT_GENERATOR_FIELD)) {
- // for now we only have a single type of generators
- while ((token = parser.nextToken()) == Token.START_OBJECT) {
- PhraseSuggestionContext.DirectCandidateGenerator generator = parseCandidateGenerator(parser, mapperService, parseFieldMatcher);
- verifyGenerator(generator);
- suggestion.addGenerator(generator);
- }
- } else {
- throw new IllegalArgumentException("suggester[phrase] doesn't support array field [" + fieldName + "]");
- }
- } else if (token == Token.START_OBJECT) {
- if ("smoothing".equals(fieldName)) {
- parseSmoothingModel(parser, suggestion, fieldName);
- } else if ("highlight".equals(fieldName)) {
- while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
- if (token == XContentParser.Token.FIELD_NAME) {
- fieldName = parser.currentName();
- } else if (token.isValue()) {
- if ("pre_tag".equals(fieldName) || "preTag".equals(fieldName)) {
- suggestion.setPreTag(parser.utf8Bytes());
- } else if ("post_tag".equals(fieldName) || "postTag".equals(fieldName)) {
- suggestion.setPostTag(parser.utf8Bytes());
- } else {
- throw new IllegalArgumentException(
- "suggester[phrase][highlight] doesn't support field [" + fieldName + "]");
- }
- }
- }
- } else if ("collate".equals(fieldName)) {
- while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
- if (token == XContentParser.Token.FIELD_NAME) {
- fieldName = parser.currentName();
- } else if ("query".equals(fieldName)) {
- if (suggestion.getCollateQueryScript() != null) {
- throw new IllegalArgumentException("suggester[phrase][collate] query already set, doesn't support additional [" + fieldName + "]");
- }
- Template template = Template.parse(parser, parseFieldMatcher);
- CompiledScript compiledScript = scriptService.compile(template, ScriptContext.Standard.SEARCH, Collections.emptyMap());
- suggestion.setCollateQueryScript(compiledScript);
- } else if ("params".equals(fieldName)) {
- suggestion.setCollateScriptParams(parser.map());
- } else if ("prune".equals(fieldName)) {
- if (parser.isBooleanValue()) {
- suggestion.setCollatePrune(parser.booleanValue());
- } else {
- throw new IllegalArgumentException("suggester[phrase][collate] prune must be either 'true' or 'false'");
- }
- } else {
- throw new IllegalArgumentException(
- "suggester[phrase][collate] doesn't support field [" + fieldName + "]");
- }
- }
- } else {
- throw new IllegalArgumentException("suggester[phrase] doesn't support array field [" + fieldName + "]");
- }
- } else {
- throw new IllegalArgumentException("suggester[phrase] doesn't support field [" + fieldName + "]");
- }
- }
-
- if (suggestion.getField() == null) {
- throw new IllegalArgumentException("The required field option is missing");
- }
-
- MappedFieldType fieldType = mapperService.fullName(suggestion.getField());
- if (fieldType == null) {
- throw new IllegalArgumentException("No mapping found for field [" + suggestion.getField() + "]");
- } else if (suggestion.getAnalyzer() == null) {
- // no analyzer name passed in, so try the field's analyzer, or the default analyzer
- if (fieldType.searchAnalyzer() == null) {
- suggestion.setAnalyzer(mapperService.searchAnalyzer());
- } else {
- suggestion.setAnalyzer(fieldType.searchAnalyzer());
- }
- }
-
- if (suggestion.model() == null) {
- suggestion.setModel(StupidBackoffScorer.FACTORY);
- }
-
- if (!gramSizeSet || suggestion.generators().isEmpty()) {
- final ShingleTokenFilterFactory.Factory shingleFilterFactory = SuggestUtils.getShingleFilterFactory(suggestion.getAnalyzer());
- if (!gramSizeSet) {
- // try to detect the shingle size
- if (shingleFilterFactory != null) {
- suggestion.setGramSize(shingleFilterFactory.getMaxShingleSize());
- if (suggestion.getAnalyzer() == null && shingleFilterFactory.getMinShingleSize() > 1 && !shingleFilterFactory.getOutputUnigrams()) {
- throw new IllegalArgumentException("The default analyzer for field: [" + suggestion.getField() + "] doesn't emit unigrams. If this is intentional try to set the analyzer explicitly");
- }
- }
- }
- if (suggestion.generators().isEmpty()) {
- if (shingleFilterFactory != null && shingleFilterFactory.getMinShingleSize() > 1 && !shingleFilterFactory.getOutputUnigrams() && suggestion.getRequireUnigram()) {
- throw new IllegalArgumentException("The default candidate generator for phrase suggest can't operate on field: [" + suggestion.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(suggestion.getField());
- suggestion.addGenerator(generator);
- }
- }
- return suggestion;
- }
-
- public void parseSmoothingModel(XContentParser parser, PhraseSuggestionContext suggestion, String fieldName) throws IOException {
- XContentParser.Token token;
- while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
- if (token == XContentParser.Token.FIELD_NAME) {
- fieldName = parser.currentName();
- if ("linear".equals(fieldName)) {
- ensureNoSmoothing(suggestion);
- final double[] lambdas = new double[3];
- while ((token = parser.nextToken()) != Token.END_OBJECT) {
- if (token == XContentParser.Token.FIELD_NAME) {
- fieldName = parser.currentName();
- }
- if (token.isValue()) {
- if ("trigram_lambda".equals(fieldName) || "trigramLambda".equals(fieldName)) {
- lambdas[0] = parser.doubleValue();
- if (lambdas[0] < 0) {
- throw new IllegalArgumentException("trigram_lambda must be positive");
- }
- } else if ("bigram_lambda".equals(fieldName) || "bigramLambda".equals(fieldName)) {
- lambdas[1] = parser.doubleValue();
- if (lambdas[1] < 0) {
- throw new IllegalArgumentException("bigram_lambda must be positive");
- }
- } else if ("unigram_lambda".equals(fieldName) || "unigramLambda".equals(fieldName)) {
- lambdas[2] = parser.doubleValue();
- if (lambdas[2] < 0) {
- throw new IllegalArgumentException("unigram_lambda must be positive");
- }
- } else {
- throw new IllegalArgumentException(
- "suggester[phrase][smoothing][linear] doesn't support field [" + fieldName + "]");
- }
- }
- }
- double sum = 0.0d;
- for (int i = 0; i < lambdas.length; i++) {
- sum += lambdas[i];
- }
- if (Math.abs(sum - 1.0) > 0.001) {
- throw new IllegalArgumentException("linear smoothing lambdas must sum to 1");
- }
- suggestion.setModel(new WordScorer.WordScorerFactory() {
- @Override
- public WordScorer newScorer(IndexReader reader, Terms terms, String field, double realWordLikelyhood, BytesRef separator)
- throws IOException {
- return new LinearInterpoatingScorer(reader, terms, field, realWordLikelyhood, separator, lambdas[0], lambdas[1],
- lambdas[2]);
- }
- });
- } else if ("laplace".equals(fieldName)) {
- ensureNoSmoothing(suggestion);
- double theAlpha = Laplace.DEFAULT_LAPLACE_ALPHA;
-
- while ((token = parser.nextToken()) != Token.END_OBJECT) {
- if (token == XContentParser.Token.FIELD_NAME) {
- fieldName = parser.currentName();
- }
- if (token.isValue() && "alpha".equals(fieldName)) {
- theAlpha = parser.doubleValue();
- }
- }
- final double alpha = theAlpha;
- suggestion.setModel(new WordScorer.WordScorerFactory() {
- @Override
- public WordScorer newScorer(IndexReader reader, Terms terms, String field, double realWordLikelyhood, BytesRef separator)
- throws IOException {
- return new LaplaceScorer(reader, terms, field, realWordLikelyhood, separator, alpha);
- }
- });
-
- } else if ("stupid_backoff".equals(fieldName) || "stupidBackoff".equals(fieldName)) {
- ensureNoSmoothing(suggestion);
- double theDiscount = StupidBackoff.DEFAULT_BACKOFF_DISCOUNT;
- while ((token = parser.nextToken()) != Token.END_OBJECT) {
- if (token == XContentParser.Token.FIELD_NAME) {
- fieldName = parser.currentName();
- }
- if (token.isValue() && "discount".equals(fieldName)) {
- theDiscount = parser.doubleValue();
- }
- }
- final double discount = theDiscount;
- suggestion.setModel(new WordScorer.WordScorerFactory() {
- @Override
- public WordScorer newScorer(IndexReader reader, Terms terms, String field, double realWordLikelyhood, BytesRef separator)
- throws IOException {
- return new StupidBackoffScorer(reader, terms, field, realWordLikelyhood, separator, discount);
- }
- });
-
- } else {
- throw new IllegalArgumentException("suggester[phrase] doesn't support object field [" + fieldName + "]");
- }
- }
- }
- }
-
- private void ensureNoSmoothing(PhraseSuggestionContext suggestion) {
- if (suggestion.model() != null) {
- throw new IllegalArgumentException("only one smoothing model supported");
- }
- }
-
- private void verifyGenerator(PhraseSuggestionContext.DirectCandidateGenerator suggestion) {
- // Verify options and set defaults
- if (suggestion.field() == null) {
- throw new IllegalArgumentException("The required field option is missing");
- }
- }
-
- static PhraseSuggestionContext.DirectCandidateGenerator parseCandidateGenerator(XContentParser parser, MapperService mapperService,
- ParseFieldMatcher parseFieldMatcher) throws IOException {
- XContentParser.Token token;
- String fieldName = null;
- PhraseSuggestionContext.DirectCandidateGenerator generator = new PhraseSuggestionContext.DirectCandidateGenerator();
- while ((token = parser.nextToken()) != Token.END_OBJECT) {
- if (token == XContentParser.Token.FIELD_NAME) {
- fieldName = parser.currentName();
- }
- if (token.isValue()) {
- if (!SuggestUtils.parseDirectSpellcheckerSettings(parser, fieldName, generator, parseFieldMatcher)) {
- if ("field".equals(fieldName)) {
- generator.setField(parser.text());
- if (mapperService.fullName(generator.field()) == null) {
- throw new IllegalArgumentException("No mapping found for field [" + generator.field() + "]");
- }
- } else if ("size".equals(fieldName)) {
- generator.size(parser.intValue());
- } else if ("pre_filter".equals(fieldName) || "preFilter".equals(fieldName)) {
- String analyzerName = parser.text();
- Analyzer analyzer = mapperService.analysisService().analyzer(analyzerName);
- if (analyzer == null) {
- throw new IllegalArgumentException("Analyzer [" + analyzerName + "] doesn't exists");
- }
- generator.preFilter(analyzer);
- } else if ("post_filter".equals(fieldName) || "postFilter".equals(fieldName)) {
- String analyzerName = parser.text();
- Analyzer analyzer = mapperService.analysisService().analyzer(analyzerName);
- if (analyzer == null) {
- throw new IllegalArgumentException("Analyzer [" + analyzerName + "] doesn't exists");
- }
- generator.postFilter(analyzer);
- } else {
- throw new IllegalArgumentException("CandidateGenerator doesn't support [" + fieldName + "]");
- }
- }
- }
- }
- return generator;
- }
-}
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 8f3e5164e4..14bced639f 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
@@ -38,7 +38,6 @@ import org.elasticsearch.script.ScriptService;
import org.elasticsearch.search.suggest.Suggest.Suggestion;
import org.elasticsearch.search.suggest.Suggest.Suggestion.Entry;
import org.elasticsearch.search.suggest.Suggest.Suggestion.Entry.Option;
-import org.elasticsearch.search.suggest.SuggestContextParser;
import org.elasticsearch.search.suggest.SuggestUtils;
import org.elasticsearch.search.suggest.Suggester;
import org.elasticsearch.search.suggest.SuggestionBuilder;
@@ -145,11 +144,6 @@ public final class PhraseSuggester extends Suggester<PhraseSuggestionContext> {
}
@Override
- public SuggestContextParser getContextParser() {
- return new PhraseSuggestParser(this);
- }
-
- @Override
public SuggestionBuilder<?> getBuilderPrototype() {
return PhraseSuggestionBuilder.PROTOTYPE;
}
diff --git a/core/src/main/java/org/elasticsearch/search/suggest/phrase/WordScorer.java b/core/src/main/java/org/elasticsearch/search/suggest/phrase/WordScorer.java
index 9557715bcb..69e62c1a17 100644
--- a/core/src/main/java/org/elasticsearch/search/suggest/phrase/WordScorer.java
+++ b/core/src/main/java/org/elasticsearch/search/suggest/phrase/WordScorer.java
@@ -77,7 +77,7 @@ public abstract class WordScorer {
}
return candidate.stringDistance;
}
-
+
public double score(Candidate[] path, CandidateSet[] candidateSet, int at, int gramSize) throws IOException {
if (at == 0 || gramSize == 1) {
return Math.log10(channelScore(path[at], candidateSet[at].originalTerm) * scoreUnigram(path[at]));
@@ -87,21 +87,21 @@ public abstract class WordScorer {
return Math.log10(channelScore(path[at], candidateSet[at].originalTerm) * scoreTrigram(path[at], path[at - 1], path[at - 2]));
}
}
-
+
protected double scoreUnigram(Candidate word) throws IOException {
return (1.0 + frequency(word.term)) / (vocabluarySize + numTerms);
}
-
+
protected double scoreBigram(Candidate word, Candidate w_1) throws IOException {
return scoreUnigram(word);
}
-
+
protected double scoreTrigram(Candidate word, Candidate w_1, Candidate w_2) throws IOException {
return scoreBigram(word, w_1);
}
- public static interface WordScorerFactory {
- public WordScorer newScorer(IndexReader reader, Terms terms,
- String field, double realWordLikelyhood, BytesRef separator) throws IOException;
+ public interface WordScorerFactory {
+ WordScorer newScorer(IndexReader reader, Terms terms,
+ String field, double realWordLikelyhood, BytesRef separator) throws IOException;
}
}
diff --git a/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestParser.java b/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestParser.java
deleted file mode 100644
index 7e75976d3a..0000000000
--- a/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestParser.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to Elasticsearch under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.elasticsearch.search.suggest.term;
-
-import org.elasticsearch.common.ParseFieldMatcher;
-import org.elasticsearch.common.xcontent.XContentParser;
-import org.elasticsearch.index.mapper.MapperService;
-import org.elasticsearch.index.query.QueryShardContext;
-import org.elasticsearch.search.suggest.DirectSpellcheckerSettings;
-import org.elasticsearch.search.suggest.SuggestContextParser;
-import org.elasticsearch.search.suggest.SuggestUtils;
-import org.elasticsearch.search.suggest.SuggestionSearchContext;
-
-import java.io.IOException;
-
-public final class TermSuggestParser implements SuggestContextParser {
-
- private TermSuggester suggester;
-
- public TermSuggestParser(TermSuggester suggester) {
- this.suggester = suggester;
- }
-
- @Override
- public SuggestionSearchContext.SuggestionContext parse(XContentParser parser, QueryShardContext shardContext) throws IOException {
- MapperService mapperService = shardContext.getMapperService();
- XContentParser.Token token;
- String fieldName = null;
- TermSuggestionContext suggestion = new TermSuggestionContext(shardContext);
- DirectSpellcheckerSettings settings = suggestion.getDirectSpellCheckerSettings();
- while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
- if (token == XContentParser.Token.FIELD_NAME) {
- fieldName = parser.currentName();
- } else if (token.isValue()) {
- parseTokenValue(parser, mapperService, fieldName, suggestion, settings, mapperService.getIndexSettings().getParseFieldMatcher());
- } else {
- throw new IllegalArgumentException("suggester[term] doesn't support field [" + fieldName + "]");
- }
- }
- return suggestion;
- }
-
- private void parseTokenValue(XContentParser parser, MapperService mapperService, String fieldName, TermSuggestionContext suggestion,
- DirectSpellcheckerSettings settings, ParseFieldMatcher parseFieldMatcher) throws IOException {
- if (!(SuggestUtils.parseSuggestContext(parser, mapperService, fieldName, suggestion, parseFieldMatcher) || SuggestUtils.parseDirectSpellcheckerSettings(
- parser, fieldName, settings, parseFieldMatcher))) {
- throw new IllegalArgumentException("suggester[term] doesn't support [" + fieldName + "]");
-
- }
- }
-
-}
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 78ed8be6a2..4bffb2dfe8 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
@@ -28,7 +28,6 @@ import org.apache.lucene.util.BytesRefBuilder;
import org.apache.lucene.util.CharsRefBuilder;
import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.text.Text;
-import org.elasticsearch.search.suggest.SuggestContextParser;
import org.elasticsearch.search.suggest.SuggestUtils;
import org.elasticsearch.search.suggest.Suggester;
import org.elasticsearch.search.suggest.SuggestionBuilder;
@@ -67,12 +66,6 @@ public final class TermSuggester extends Suggester<TermSuggestionContext> {
return response;
}
- @Override
- public SuggestContextParser getContextParser() {
- return new TermSuggestParser(this);
- }
-
-
private List<Token> queryTerms(SuggestionContext suggestion, CharsRefBuilder spare) throws IOException {
final List<Token> result = new ArrayList<>();
final String field = suggestion.getField();