From e2e593745546083a31ccfb9744be6174dd312858 Mon Sep 17 00:00:00 2001 From: Tanguy Leroux Date: Fri, 10 Feb 2017 10:53:38 +0100 Subject: [PATCH] Use `typed_keys` parameter to prefix suggester names by type in search responses (#23080) This pull request reuses the typed_keys parameter added in #22965, but this time it applies it to suggesters. When set to true, the suggester names in the search response will be prefixed with a prefix that reflects their type. --- .../action/search/RestMultiSearchAction.java | 2 +- .../rest/action/search/RestSearchAction.java | 3 +- .../aggregations/InternalAggregation.java | 10 ++- .../elasticsearch/search/suggest/Suggest.java | 28 ++++++- .../completion/CompletionSuggestion.java | 9 +- .../suggest/phrase/PhraseSuggestion.java | 9 +- .../search/suggest/term/TermSuggestion.java | 9 +- docs/reference/aggregations/misc.asciidoc | 4 +- docs/reference/search/suggesters.asciidoc | 2 + .../reference/search/suggesters/misc.asciidoc | 84 +++++++++++++++++++ .../RestMultiSearchTemplateAction.java | 3 +- .../mustache/RestSearchTemplateAction.java | 2 +- .../test/lang_mustache/60_typed_keys.yaml | 20 ++++- .../resources/rest-api-spec/api/msearch.json | 2 +- .../rest-api-spec/api/msearch_template.json | 2 +- .../resources/rest-api-spec/api/search.json | 2 +- .../rest-api-spec/api/search_template.json | 2 +- .../test/msearch/20_typed_keys.yaml | 18 +++- .../test/suggest/40_typed_keys.yaml | 66 +++++++++++++++ 19 files changed, 253 insertions(+), 24 deletions(-) create mode 100644 docs/reference/search/suggesters/misc.asciidoc create mode 100644 rest-api-spec/src/main/resources/rest-api-spec/test/suggest/40_typed_keys.yaml diff --git a/core/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java b/core/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java index 8913fc637bb..f27ba5018e4 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java @@ -52,7 +52,7 @@ import static org.elasticsearch.rest.RestRequest.Method.POST; public class RestMultiSearchAction extends BaseRestHandler { - private static final Set RESPONSE_PARAMS = Collections.singleton("typed_keys"); + private static final Set RESPONSE_PARAMS = Collections.singleton(RestSearchAction.TYPED_KEYS_PARAM); private final boolean allowExplicitIndex; diff --git a/core/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java b/core/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java index fe2522f31d4..bf8308202b7 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java @@ -54,7 +54,8 @@ import static org.elasticsearch.search.suggest.SuggestBuilders.termSuggestion; public class RestSearchAction extends BaseRestHandler { - private static final Set RESPONSE_PARAMS = Collections.singleton("typed_keys"); + public static final String TYPED_KEYS_PARAM = "typed_keys"; + private static final Set RESPONSE_PARAMS = Collections.singleton(TYPED_KEYS_PARAM); public RestSearchAction(Settings settings, RestController controller) { super(settings); diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/InternalAggregation.java b/core/src/main/java/org/elasticsearch/search/aggregations/InternalAggregation.java index 6dfd6fcc79f..6af896426a7 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/InternalAggregation.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/InternalAggregation.java @@ -25,6 +25,7 @@ import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.util.BigArrays; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.rest.action.search.RestSearchAction; import org.elasticsearch.script.ScriptService; import org.elasticsearch.search.aggregations.pipeline.PipelineAggregator; import org.elasticsearch.search.aggregations.support.AggregationPath; @@ -164,9 +165,12 @@ public abstract class InternalAggregation implements Aggregation, ToXContent, Na @Override public final XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - // Concatenates the type and the name of the aggregation (ex: top_hits#foo) - String name = params.paramAsBoolean("typed_keys", false) ? String.join(TYPED_KEYS_DELIMITER, getType(), getName()) : getName(); - builder.startObject(name); + if (params.paramAsBoolean(RestSearchAction.TYPED_KEYS_PARAM, false)) { + // Concatenates the type and the name of the aggregation (ex: top_hits#foo) + builder.startObject(String.join(TYPED_KEYS_DELIMITER, getType(), getName())); + } else { + builder.startObject(getName()); + } if (this.metaData != null) { builder.field(CommonFields.META); builder.map(this.metaData); diff --git a/core/src/main/java/org/elasticsearch/search/suggest/Suggest.java b/core/src/main/java/org/elasticsearch/search/suggest/Suggest.java index ec7294f9001..f1875564f85 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/Suggest.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/Suggest.java @@ -30,6 +30,8 @@ import org.elasticsearch.common.xcontent.ToXContentObject; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.rest.action.search.RestSearchAction; +import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.suggest.Suggest.Suggestion.Entry; import org.elasticsearch.search.suggest.Suggest.Suggestion.Entry.Option; import org.elasticsearch.search.suggest.completion.CompletionSuggestion; @@ -149,7 +151,7 @@ public class Suggest implements Iterable command : suggestions) { - out.writeVInt(command.getType()); + out.writeVInt(command.getWriteableType()); command.writeTo(out); } } @@ -206,6 +208,8 @@ public class Suggest implements Iterable implements Iterable, Streamable, ToXContent { + private static final String NAME = "suggestion"; + public static final int TYPE = 0; protected String name; protected int size; @@ -223,10 +227,23 @@ public class Suggest implements Iterable iterator() { return entries.iterator(); @@ -338,7 +355,12 @@ public class Suggest implements Iterable entry : entries) { entry.toXContent(builder, params); } 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 1d8da832717..e33e421f774 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 @@ -57,6 +57,8 @@ import static org.elasticsearch.search.suggest.Suggest.COMPARATOR; */ public final class CompletionSuggestion extends Suggest.Suggestion { + private static final String NAME = "completion"; + public static final int TYPE = 4; public CompletionSuggestion() { @@ -165,10 +167,15 @@ public final class CompletionSuggestion extends Suggest.Suggestion { + + private static final String NAME = "phrase"; public static final int TYPE = 3; public PhraseSuggestion() { @@ -41,10 +43,15 @@ public class PhraseSuggestion extends Suggest.Suggestion } @Override - public int getType() { + public int getWriteableType() { return TYPE; } + @Override + protected String getType() { + return NAME; + } + @Override protected Entry newEntry() { return new Entry(); diff --git a/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestion.java b/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestion.java index b0586b7287c..68aed8b80a5 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestion.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestion.java @@ -40,6 +40,8 @@ import static org.elasticsearch.common.xcontent.ConstructingObjectParser.constru */ public class TermSuggestion extends Suggestion { + private static final String NAME = "term"; + public static final Comparator SCORE = new Score(); public static final Comparator FREQUENCY = new Frequency(); public static final int TYPE = 1; @@ -96,10 +98,15 @@ public class TermSuggestion extends Suggestion { } @Override - public int getType() { + public int getWriteableType() { return TYPE; } + @Override + protected String getType() { + return NAME; + } + @Override protected Comparator