summaryrefslogtreecommitdiff
path: root/core/src/main/java/org/elasticsearch/search/suggest/completion
diff options
context:
space:
mode:
authorAreek Zillur <areek.zillur@elasticsearch.com>2016-03-05 01:07:57 -0500
committerAreek Zillur <areek.zillur@elasticsearch.com>2016-03-09 11:53:13 -0500
commit987f2f5aa8575bbbee2ba524e9e5fa48abe9391d (patch)
treeac937fb72919c90bcd3e69f040e5dd266bfaccf9 /core/src/main/java/org/elasticsearch/search/suggest/completion
parent5bb72dbcd247637ed823bd3f89a9c54e88fe7645 (diff)
cleanup
Diffstat (limited to 'core/src/main/java/org/elasticsearch/search/suggest/completion')
-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.java53
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionContext.java12
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/completion/FuzzyOptions.java28
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/completion/RegexOptions.java21
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/completion/context/ContextMapping.java8
6 files changed, 71 insertions, 53 deletions
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 be90a2e7e7..e3953c8e0b 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
@@ -84,7 +84,7 @@ public class CompletionSuggester extends Suggester<CompletionSuggestionContext>
}
// collect payloads
final Map<String, List<Object>> payload = new HashMap<>(0);
- Set<String> payloadFields = suggestionContext.getPayloadFields();
+ List<String> payloadFields = suggestionContext.getPayloadFields();
if (payloadFields.isEmpty() == false) {
final int readerIndex = ReaderUtil.subIndex(suggestDoc.doc, leaves);
final LeafReaderContext subReaderContext = leaves.get(readerIndex);
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 38242a29ae..141e41e826 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
@@ -18,7 +18,7 @@
*/
package org.elasticsearch.search.suggest.completion;
-import org.elasticsearch.ElasticsearchException;
+import org.elasticsearch.ElasticsearchParseException;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.io.stream.StreamInput;
@@ -64,9 +64,9 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug
static final ParseField CONTEXTS_FIELD = new ParseField("contexts", "context");
private static ObjectParser<CompletionSuggestionBuilder, Void> TLP_PARSER =
- new ObjectParser<>(CompletionSuggestionBuilder.SUGGESTION_NAME, null);
+ new ObjectParser<>(SUGGESTION_NAME, null);
static {
- TLP_PARSER.declareStringArray(CompletionSuggestionBuilder::payload, CompletionSuggestionBuilder.PAYLOAD_FIELD);
+ TLP_PARSER.declareStringArray(CompletionSuggestionBuilder::payload, PAYLOAD_FIELD);
TLP_PARSER.declareField((parser, completionSuggestionContext, context) -> {
if (parser.currentToken() == XContentParser.Token.VALUE_BOOLEAN) {
if (parser.booleanValue()) {
@@ -90,7 +90,7 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug
builder.copyCurrentStructure(p);
v.contextBytes = builder.bytes();
p.skipChildren();
- }, CompletionSuggestionBuilder.CONTEXTS_FIELD, ObjectParser.ValueType.OBJECT); // context is deprecated
+ }, CONTEXTS_FIELD, ObjectParser.ValueType.OBJECT); // context is deprecated
}
private FuzzyOptions fuzzyOptions;
@@ -103,6 +103,18 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug
}
/**
+ * internal copy constructor that copies over all class fields except for the fieldname which is
+ * set to the one provided in the first argument
+ */
+ private CompletionSuggestionBuilder(String fieldname, CompletionSuggestionBuilder in) {
+ super(fieldname, in);
+ fuzzyOptions = in.fuzzyOptions;
+ regexOptions = in.regexOptions;
+ contextBytes = in.contextBytes;
+ payloadFields = in.payloadFields;
+ }
+
+ /**
* Sets the prefix to provide completions for.
* The prefix gets analyzed by the suggest analyzer.
*/
@@ -184,6 +196,12 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug
}
}
+ private String field;
+ private CompletionSuggestionBuilder field(String fieldName) {
+ this.field = fieldName;
+ return this;
+ }
+
@Override
protected XContentBuilder innerToXContent(XContentBuilder builder, Params params) throws IOException {
if (payloadFields.isEmpty() == false) {
@@ -209,9 +227,15 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug
@Override
protected CompletionSuggestionBuilder innerFromXContent(QueryParseContext parseContext) throws IOException {
- CompletionSuggestionBuilder builder = new CompletionSuggestionBuilder();
+ CompletionSuggestionBuilder builder = new CompletionSuggestionBuilder("_na_");
TLP_PARSER.parse(parseContext.parser(), builder);
- return builder;
+ String field = builder.field;
+ // now we should have field name, check and copy fields over to the suggestion builder we return
+ if (field == null) {
+ throw new ElasticsearchParseException(
+ "required field [" + SuggestUtils.Fields.FIELD.getPreferredName() + "] is missing");
+ }
+ return new CompletionSuggestionBuilder(field, builder);
}
@Override
@@ -224,10 +248,9 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug
suggestionContext.setFuzzyOptions(fuzzyOptions);
suggestionContext.setRegexOptions(regexOptions);
MappedFieldType mappedFieldType = mapperService.fullName(suggestionContext.getField());
- if (mappedFieldType == null) {
- throw new ElasticsearchException("Field [" + suggestionContext.getField() + "] is not a completion suggest field");
- } else if (mappedFieldType instanceof CompletionFieldMapper.CompletionFieldType) {
+ if (mappedFieldType != null && mappedFieldType instanceof CompletionFieldMapper.CompletionFieldType) {
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));
@@ -247,9 +270,8 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug
@Override
public void doWriteTo(StreamOutput out) throws IOException {
- boolean payloadFieldExists = payloadFields.isEmpty() == false;
- out.writeBoolean(payloadFieldExists);
- if (payloadFieldExists) {
+ out.writeBoolean(payloadFields.isEmpty() == false);
+ if (payloadFields.isEmpty() == false) {
out.writeVInt(payloadFields.size());
for (String payloadField : payloadFields) {
out.writeString(payloadField);
@@ -263,9 +285,8 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug
if (regexOptions != null) {
regexOptions.writeTo(out);
}
- boolean queryContextsExists = contextBytes != null;
- out.writeBoolean(queryContextsExists);
- if (queryContextsExists) {
+ out.writeBoolean(contextBytes != null);
+ if (contextBytes != null) {
out.writeBytesReference(contextBytes);
}
}
@@ -295,7 +316,7 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug
@Override
protected boolean doEquals(CompletionSuggestionBuilder other) {
- return Objects.equals(payloadFields, other.payloadFields) &&
+ return Objects.equals(payloadFields, other.payloadFields) &&
Objects.equals(fuzzyOptions, other.fuzzyOptions) &&
Objects.equals(regexOptions, other.regexOptions) &&
Objects.equals(contextBytes, other.contextBytes);
diff --git a/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionContext.java b/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionContext.java
index c681455117..f9f948a551 100644
--- a/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionContext.java
+++ b/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionContext.java
@@ -27,10 +27,8 @@ import org.elasticsearch.search.suggest.completion.context.ContextMapping;
import org.elasticsearch.search.suggest.completion.context.ContextMappings;
import java.util.Collections;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
-import java.util.Set;
/**
*
@@ -45,7 +43,7 @@ public class CompletionSuggestionContext extends SuggestionSearchContext.Suggest
private FuzzyOptions fuzzyOptions;
private RegexOptions regexOptions;
private Map<String, List<ContextMapping.InternalQueryContext>> queryContexts = Collections.emptyMap();
- private Set<String> payloadFields = Collections.emptySet();
+ private List<String> payloadFields = Collections.emptyList();
CompletionFieldMapper.CompletionFieldType getFieldType() {
return this.fieldType;
@@ -67,15 +65,11 @@ public class CompletionSuggestionContext extends SuggestionSearchContext.Suggest
this.queryContexts = queryContexts;
}
- void setPayloadFields(Set<String> fields) {
- this.payloadFields = fields;
- }
-
void setPayloadFields(List<String> fields) {
- setPayloadFields(new HashSet<>(fields));
+ this.payloadFields = fields;
}
- Set<String> getPayloadFields() {
+ List<String> getPayloadFields() {
return payloadFields;
}
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 aac58d7cb3..709124443b 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
@@ -40,20 +40,20 @@ import java.util.Objects;
*/
public class FuzzyOptions implements ToXContent, Writeable<FuzzyOptions> {
static final ParseField FUZZY_OPTIONS = new ParseField("fuzzy");
- static final ParseField TRANSPOSITION_FIELD = new ParseField("transpositions");
- static final ParseField MIN_LENGTH_FIELD = new ParseField("min_length");
- static final ParseField PREFIX_LENGTH_FIELD = new ParseField("prefix_length");
- static final ParseField UNICODE_AWARE_FIELD = new ParseField("unicode_aware");
- static final ParseField MAX_DETERMINIZED_STATES_FIELD = new ParseField("max_determinized_states");
+ private static final ParseField TRANSPOSITION_FIELD = new ParseField("transpositions");
+ private static final ParseField MIN_LENGTH_FIELD = new ParseField("min_length");
+ private static final ParseField PREFIX_LENGTH_FIELD = new ParseField("prefix_length");
+ private static final ParseField UNICODE_AWARE_FIELD = new ParseField("unicode_aware");
+ private static final ParseField MAX_DETERMINIZED_STATES_FIELD = new ParseField("max_determinized_states");
- static ObjectParser<FuzzyOptions.Builder, Void> FUZZY_PARSER = new ObjectParser<>(FUZZY_OPTIONS.getPreferredName(), Builder::new);
+ private static ObjectParser<Builder, Void> PARSER = new ObjectParser<>(FUZZY_OPTIONS.getPreferredName(), Builder::new);
static {
- FUZZY_PARSER.declareInt(FuzzyOptions.Builder::setFuzzyMinLength, MIN_LENGTH_FIELD);
- FUZZY_PARSER.declareInt(FuzzyOptions.Builder::setMaxDeterminizedStates, MAX_DETERMINIZED_STATES_FIELD);
- FUZZY_PARSER.declareBoolean(FuzzyOptions.Builder::setUnicodeAware, UNICODE_AWARE_FIELD);
- FUZZY_PARSER.declareInt(FuzzyOptions.Builder::setFuzzyPrefixLength, PREFIX_LENGTH_FIELD);
- FUZZY_PARSER.declareBoolean(FuzzyOptions.Builder::setTranspositions, TRANSPOSITION_FIELD);
- FUZZY_PARSER.declareValue((a, b) -> {
+ PARSER.declareInt(Builder::setFuzzyMinLength, MIN_LENGTH_FIELD);
+ PARSER.declareInt(Builder::setMaxDeterminizedStates, MAX_DETERMINIZED_STATES_FIELD);
+ PARSER.declareBoolean(Builder::setUnicodeAware, UNICODE_AWARE_FIELD);
+ PARSER.declareInt(Builder::setFuzzyPrefixLength, PREFIX_LENGTH_FIELD);
+ PARSER.declareBoolean(Builder::setTranspositions, TRANSPOSITION_FIELD);
+ PARSER.declareValue((a, b) -> {
try {
a.setFuzziness(Fuzziness.parse(b).asDistance());
} catch (IOException e) {
@@ -82,8 +82,8 @@ public class FuzzyOptions implements ToXContent, Writeable<FuzzyOptions> {
private FuzzyOptions() {
}
- public static FuzzyOptions parse(XContentParser parser) throws IOException {
- return FUZZY_PARSER.parse(parser).build();
+ static FuzzyOptions parse(XContentParser parser) throws IOException {
+ return PARSER.parse(parser).build();
}
public static Builder builder() {
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 a1dcec2d55..81e524d6e3 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
@@ -38,17 +38,14 @@ import java.io.IOException;
* Regular expression options for completion suggester
*/
public class RegexOptions implements ToXContent, Writeable<RegexOptions> {
- static final String NAME = "regex";
- static final ParseField REGEX_OPTIONS = new ParseField(NAME);
- static final ParseField FLAGS_VALUE = new ParseField("flags", "flags_value");
- static final ParseField MAX_DETERMINIZED_STATES = new ParseField("max_determinized_states");
+ static final ParseField REGEX_OPTIONS = new ParseField("regex");
+ private static final ParseField FLAGS_VALUE = new ParseField("flags", "flags_value");
+ private static final ParseField MAX_DETERMINIZED_STATES = new ParseField("max_determinized_states");
-
- private static ObjectParser<RegexOptions.Builder, Void> REGEXP_PARSER =
- new ObjectParser<>(REGEX_OPTIONS.getPreferredName(), RegexOptions.Builder::new);
+ private static ObjectParser<Builder, Void> PARSER = new ObjectParser<>(REGEX_OPTIONS.getPreferredName(), Builder::new);
static {
- REGEXP_PARSER.declareInt(RegexOptions.Builder::setMaxDeterminizedStates, MAX_DETERMINIZED_STATES);
- REGEXP_PARSER.declareField((parser, builder, aVoid) -> {
+ PARSER.declareInt(Builder::setMaxDeterminizedStates, MAX_DETERMINIZED_STATES);
+ PARSER.declareField((parser, builder, aVoid) -> {
if (parser.currentToken() == XContentParser.Token.VALUE_STRING) {
builder.setFlags(parser.text());
} else if (parser.currentToken() == XContentParser.Token.VALUE_NUMBER) {
@@ -58,7 +55,7 @@ public class RegexOptions implements ToXContent, Writeable<RegexOptions> {
+ " " + FLAGS_VALUE.getPreferredName() + " supports string or number");
}
}, FLAGS_VALUE, ObjectParser.ValueType.VALUE);
- REGEXP_PARSER.declareStringOrNull(RegexOptions.Builder::setFlags, FLAGS_VALUE);
+ PARSER.declareStringOrNull(Builder::setFlags, FLAGS_VALUE);
}
private int flagsValue;
@@ -91,8 +88,8 @@ public class RegexOptions implements ToXContent, Writeable<RegexOptions> {
return new Builder();
}
- public static RegexOptions parse(XContentParser parser) throws IOException {
- return REGEXP_PARSER.parse(parser).build();
+ static RegexOptions parse(XContentParser parser) throws IOException {
+ return PARSER.parse(parser).build();
}
@Override
diff --git a/core/src/main/java/org/elasticsearch/search/suggest/completion/context/ContextMapping.java b/core/src/main/java/org/elasticsearch/search/suggest/completion/context/ContextMapping.java
index 501f4d153d..959a749a85 100644
--- a/core/src/main/java/org/elasticsearch/search/suggest/completion/context/ContextMapping.java
+++ b/core/src/main/java/org/elasticsearch/search/suggest/completion/context/ContextMapping.java
@@ -96,12 +96,15 @@ public abstract class ContextMapping<T extends QueryContext> implements ToXConte
*/
protected abstract Set<CharSequence> parseContext(ParseContext.Document document);
+ /**
+ * Prototype for the query context
+ */
protected abstract T prototype();
/**
* Parses query contexts for this mapper
*/
- public List<InternalQueryContext> parseQueryContext(XContentParser parser) throws IOException, ElasticsearchParseException {
+ public final List<InternalQueryContext> parseQueryContext(XContentParser parser) throws IOException, ElasticsearchParseException {
List<T> queryContexts = new ArrayList<>();
Token token = parser.nextToken();
if (token == Token.START_OBJECT || token == Token.VALUE_STRING) {
@@ -114,6 +117,9 @@ public abstract class ContextMapping<T extends QueryContext> implements ToXConte
return toInternalQueryContexts(queryContexts);
}
+ /**
+ * Convert query contexts to common representation
+ */
protected abstract List<InternalQueryContext> toInternalQueryContexts(List<T> queryContexts);
/**