diff options
author | Areek Zillur <areek.zillur@elasticsearch.com> | 2016-08-08 14:56:28 -0400 |
---|---|---|
committer | Areek Zillur <areek.zillur@elasticsearch.com> | 2016-08-08 16:04:06 -0400 |
commit | d107141bf6b50de1b448dd56be6faecf5005b7fb (patch) | |
tree | 401a7968eb8992409198ce28fa233cb05066e674 /core/src/main/java/org/elasticsearch/search/suggest/completion | |
parent | bf0e42aaebe085f8c611d48b211e133519a42829 (diff) |
Remove payload option from completion suggester
The payload option was introduced with the new completion
suggester implementation in v5, as a stop gap solution
to return additional metadata with suggestions.
Now we can return associated documents with suggestions
(#19536) through fetch phase using stored field (_source).
The additional fetch phase ensures that we only fetch
the _source for the global top-N suggestions instead of
fetching _source of top results for each shard.
Diffstat (limited to 'core/src/main/java/org/elasticsearch/search/suggest/completion')
4 files changed, 4 insertions, 107 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 c27f378915..4d118b64e5 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 @@ -78,7 +78,6 @@ public class CompletionSuggester extends Suggester<CompletionSuggestionContext> TopSuggestDocsCollector collector = new TopDocumentsCollector(suggestionContext.getSize()); suggest(searcher, suggestionContext.toQuery(), collector); int numResult = 0; - List<LeafReaderContext> leaves = searcher.getIndexReader().leaves(); for (TopSuggestDocs.SuggestScoreDoc suggestScoreDoc : collector.get().scoreLookupDocs()) { TopDocumentsCollector.SuggestDoc suggestDoc = (TopDocumentsCollector.SuggestDoc) suggestScoreDoc; // collect contexts @@ -86,31 +85,9 @@ public class CompletionSuggester extends Suggester<CompletionSuggestionContext> if (fieldType.hasContextMappings() && suggestDoc.getContexts().isEmpty() == false) { contexts = fieldType.getContextMappings().getNamedContexts(suggestDoc.getContexts()); } - // collect payloads - final Map<String, List<Object>> payload = new HashMap<>(0); - List<String> payloadFields = suggestionContext.getPayloadFields(); - if (payloadFields.isEmpty() == false) { - final int readerIndex = ReaderUtil.subIndex(suggestDoc.doc, leaves); - final LeafReaderContext subReaderContext = leaves.get(readerIndex); - final int subDocId = suggestDoc.doc - subReaderContext.docBase; - for (String field : payloadFields) { - MapperService mapperService = suggestionContext.getShardContext().getMapperService(); - MappedFieldType payloadFieldType = mapperService.fullName(field); - if (payloadFieldType != null) { - QueryShardContext shardContext = suggestionContext.getShardContext(); - final AtomicFieldData data = shardContext.getForField(payloadFieldType) - .load(subReaderContext); - final ScriptDocValues scriptValues = data.getScriptValues(); - scriptValues.setNextDocId(subDocId); - payload.put(field, new ArrayList<>(scriptValues.getValues())); - } else { - throw new IllegalArgumentException("payload field [" + field + "] does not exist"); - } - } - } if (numResult++ < suggestionContext.getSize()) { CompletionSuggestion.Entry.Option option = new CompletionSuggestion.Entry.Option(suggestDoc.doc, - new Text(suggestDoc.key.toString()), suggestDoc.score, contexts, payload); + new Text(suggestDoc.key.toString()), suggestDoc.score, contexts); completionSuggestEntry.addOption(option); } else { break; diff --git a/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestion.java b/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestion.java index a92cbfe1e2..8453371078 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestion.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestion.java @@ -194,14 +194,12 @@ public final class CompletionSuggestion extends Suggest.Suggestion<CompletionSug public static class Option extends Suggest.Suggestion.Entry.Option { private Map<String, Set<CharSequence>> contexts; - private Map<String, List<Object>> payload; private ScoreDoc doc; private InternalSearchHit hit; - public Option(int docID, Text text, float score, Map<String, Set<CharSequence>> contexts, Map<String, List<Object>> payload) { + public Option(int docID, Text text, float score, Map<String, Set<CharSequence>> contexts) { super(text, score); this.doc = new ScoreDoc(docID, score); - this.payload = payload; this.contexts = contexts; } @@ -216,10 +214,6 @@ public final class CompletionSuggestion extends Suggest.Suggestion<CompletionSug throw new UnsupportedOperationException(); } - public Map<String, List<Object>> getPayload() { - return payload; - } - public Map<String, Set<CharSequence>> getContexts() { return contexts; } @@ -248,17 +242,6 @@ public final class CompletionSuggestion extends Suggest.Suggestion<CompletionSug } else { builder.field("score", getScore()); } - if (payload.size() > 0) { - builder.startObject("payload"); - for (Map.Entry<String, List<Object>> entry : payload.entrySet()) { - builder.startArray(entry.getKey()); - for (Object payload : entry.getValue()) { - builder.value(payload); - } - builder.endArray(); - } - builder.endObject(); - } if (contexts.size() > 0) { builder.startObject("contexts"); for (Map.Entry<String, Set<CharSequence>> entry : contexts.entrySet()) { @@ -281,17 +264,6 @@ public final class CompletionSuggestion extends Suggest.Suggestion<CompletionSug this.hit = InternalSearchHit.readSearchHit(in, InternalSearchHits.streamContext().streamShardTarget(ShardTargetType.STREAM)); } - int payloadSize = in.readInt(); - this.payload = new LinkedHashMap<>(payloadSize); - for (int i = 0; i < payloadSize; i++) { - String payloadName = in.readString(); - int nValues = in.readVInt(); - List<Object> values = new ArrayList<>(nValues); - for (int j = 0; j < nValues; j++) { - values.add(in.readGenericValue()); - } - this.payload.put(payloadName, values); - } int contextSize = in.readInt(); this.contexts = new LinkedHashMap<>(contextSize); for (int i = 0; i < contextSize; i++) { @@ -315,15 +287,6 @@ public final class CompletionSuggestion extends Suggest.Suggestion<CompletionSug } else { out.writeBoolean(false); } - out.writeInt(payload.size()); - for (Map.Entry<String, List<Object>> entry : payload.entrySet()) { - out.writeString(entry.getKey()); - List<Object> values = entry.getValue(); - out.writeVInt(values.size()); - for (Object value : values) { - out.writeGenericValue(value); - } - } out.writeInt(contexts.size()); for (Map.Entry<String, Set<CharSequence>> entry : contexts.entrySet()) { out.writeString(entry.getKey()); @@ -341,14 +304,6 @@ public final class CompletionSuggestion extends Suggest.Suggestion<CompletionSug stringBuilder.append(getText()); stringBuilder.append(" score:"); stringBuilder.append(getScore()); - stringBuilder.append(" payload:["); - for (Map.Entry<String, List<Object>> entry : payload.entrySet()) { - stringBuilder.append(" "); - stringBuilder.append(entry.getKey()); - stringBuilder.append(":"); - stringBuilder.append(entry.getValue()); - } - stringBuilder.append("]"); stringBuilder.append(" context:["); for (Map.Entry<String, Set<CharSequence>> entry: contexts.entrySet()) { stringBuilder.append(" "); 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 7810d03004..783b6536e2 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 @@ -62,7 +62,6 @@ import java.util.Objects; */ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSuggestionBuilder> { static final String SUGGESTION_NAME = "completion"; - static final ParseField PAYLOAD_FIELD = new ParseField("payload"); static final ParseField CONTEXTS_FIELD = new ParseField("contexts", "context"); /** @@ -78,7 +77,6 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug private static ObjectParser<CompletionSuggestionBuilder.InnerBuilder, ParseFieldMatcherSupplier> TLP_PARSER = new ObjectParser<>(SUGGESTION_NAME, null); static { - TLP_PARSER.declareStringArray(CompletionSuggestionBuilder.InnerBuilder::payload, PAYLOAD_FIELD); TLP_PARSER.declareField((parser, completionSuggestionContext, context) -> { if (parser.currentToken() == XContentParser.Token.VALUE_BOOLEAN) { if (parser.booleanValue()) { @@ -108,7 +106,6 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug protected FuzzyOptions fuzzyOptions; protected RegexOptions regexOptions; protected BytesReference contextBytes = null; - protected List<String> payloadFields = Collections.emptyList(); public CompletionSuggestionBuilder(String field) { super(field); @@ -123,7 +120,6 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug fuzzyOptions = in.fuzzyOptions; regexOptions = in.regexOptions; contextBytes = in.contextBytes; - payloadFields = in.payloadFields; } /** @@ -131,8 +127,6 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug */ public CompletionSuggestionBuilder(StreamInput in) throws IOException { super(in); - payloadFields = new ArrayList<>(); - Collections.addAll(payloadFields, in.readStringArray()); fuzzyOptions = in.readOptionalWriteable(FuzzyOptions::new); regexOptions = in.readOptionalWriteable(RegexOptions::new); contextBytes = in.readOptionalBytesReference(); @@ -140,7 +134,6 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug @Override public void doWriteTo(StreamOutput out) throws IOException { - out.writeStringArray(payloadFields.toArray(new String[payloadFields.size()])); out.writeOptionalWriteable(fuzzyOptions); out.writeOptionalWriteable(regexOptions); out.writeOptionalBytesReference(contextBytes); @@ -195,16 +188,6 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug } /** - * Sets the fields to be returned as suggestion payload. - * Note: Only doc values enabled fields are supported - */ - public CompletionSuggestionBuilder payload(List<String> fields) { - Objects.requireNonNull(fields, "payload must not be null"); - this.payloadFields = fields; - return this; - } - - /** * Sets query contexts for completion * @param queryContexts named query contexts * see {@link org.elasticsearch.search.suggest.completion.context.CategoryQueryContext} @@ -348,13 +331,6 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug @Override protected XContentBuilder innerToXContent(XContentBuilder builder, Params params) throws IOException { - if (payloadFields.isEmpty() == false) { - builder.startArray(PAYLOAD_FIELD.getPreferredName()); - for (String field : payloadFields) { - builder.value(field); - } - builder.endArray(); - } if (fuzzyOptions != null) { fuzzyOptions.toXContent(builder, params); } @@ -388,7 +364,6 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug // copy over common settings to each suggestion builder final MapperService mapperService = context.getMapperService(); populateCommonFields(mapperService, suggestionContext); - suggestionContext.setPayloadFields(payloadFields); suggestionContext.setFuzzyOptions(fuzzyOptions); suggestionContext.setRegexOptions(regexOptions); MappedFieldType mappedFieldType = mapperService.fullName(suggestionContext.getField()); @@ -449,14 +424,13 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug @Override protected boolean doEquals(CompletionSuggestionBuilder other) { - return Objects.equals(payloadFields, other.payloadFields) && - Objects.equals(fuzzyOptions, other.fuzzyOptions) && + return Objects.equals(fuzzyOptions, other.fuzzyOptions) && Objects.equals(regexOptions, other.regexOptions) && Objects.equals(contextBytes, other.contextBytes); } @Override protected int doHashCode() { - return Objects.hash(payloadFields, fuzzyOptions, regexOptions, contextBytes); + return Objects.hash(fuzzyOptions, regexOptions, 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 268e0553ff..6f656d1a8c 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 @@ -45,7 +45,6 @@ public class CompletionSuggestionContext extends SuggestionSearchContext.Suggest private FuzzyOptions fuzzyOptions; private RegexOptions regexOptions; private Map<String, List<ContextMapping.InternalQueryContext>> queryContexts = Collections.emptyMap(); - private List<String> payloadFields = Collections.emptyList(); private CompletionFieldMapper2x.CompletionFieldType fieldType2x; private List<ContextQuery> contextQueries; @@ -73,14 +72,6 @@ public class CompletionSuggestionContext extends SuggestionSearchContext.Suggest this.queryContexts = queryContexts; } - void setPayloadFields(List<String> fields) { - this.payloadFields = fields; - } - - List<String> getPayloadFields() { - return payloadFields; - } - public FuzzyOptions getFuzzyOptions() { return fuzzyOptions; } |