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 76d1dbf9d48..4f431ebb81a 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 @@ -102,7 +102,7 @@ public class RestSearchAction extends BaseRestHandler { * content is read from the request using * RestAction.hasBodyContent. */ - public static void parseSearchRequest(SearchRequest searchRequest, IndicesQueriesRegistry indicesQueriesRegistry, RestRequest request, + public static void parseSearchRequest(SearchRequest searchRequest, IndicesQueriesRegistry indicesQueriesRegistry, RestRequest request, ParseFieldMatcher parseFieldMatcher, AggregatorParsers aggParsers, BytesReference restContent) throws IOException { if (searchRequest.source() == null) { searchRequest.source(new SearchSourceBuilder()); @@ -256,7 +256,7 @@ public class RestSearchAction extends BaseRestHandler { int suggestSize = request.paramAsInt("suggest_size", 5); String suggestMode = request.param("suggest_mode"); searchSourceBuilder.suggest(new SuggestBuilder().addSuggestion(suggestField, - termSuggestion().field(suggestField) + termSuggestion(suggestField) .text(suggestText).size(suggestSize) .suggestMode(SuggestMode.resolve(suggestMode)))); } diff --git a/core/src/main/java/org/elasticsearch/search/suggest/SuggestBuilders.java b/core/src/main/java/org/elasticsearch/search/suggest/SuggestBuilders.java index 33b32744f52..c9111c660f8 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/SuggestBuilders.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/SuggestBuilders.java @@ -29,32 +29,32 @@ import org.elasticsearch.search.suggest.term.TermSuggestionBuilder; public abstract class SuggestBuilders { /** - * Creates a term suggestion lookup query with the provided name + * Creates a term suggestion lookup query with the provided fieldname * * @return a {@link org.elasticsearch.search.suggest.term.TermSuggestionBuilder} * instance */ - public static TermSuggestionBuilder termSuggestion() { - return new TermSuggestionBuilder(); + public static TermSuggestionBuilder termSuggestion(String fieldname) { + return new TermSuggestionBuilder(fieldname); } /** - * Creates a phrase suggestion lookup query with the provided name + * Creates a phrase suggestion lookup query with the provided fieldname * * @return a {@link org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder} * instance */ - public static PhraseSuggestionBuilder phraseSuggestion() { - return new PhraseSuggestionBuilder(); + public static PhraseSuggestionBuilder phraseSuggestion(String fieldname) { + return new PhraseSuggestionBuilder(fieldname); } /** - * Creates a completion suggestion lookup query with the provided name + * Creates a completion suggestion lookup query with the provided fieldname * * @return a {@link org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder} * instance */ - public static CompletionSuggestionBuilder completionSuggestion() { - return new CompletionSuggestionBuilder(); + public static CompletionSuggestionBuilder completionSuggestion(String fieldname) { + return new CompletionSuggestionBuilder(fieldname); } } 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 5291be775a6..4ff418bea39 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/SuggestionBuilder.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/SuggestionBuilder.java @@ -23,6 +23,7 @@ import org.apache.lucene.analysis.Analyzer; import org.elasticsearch.action.support.ToXContentToBytes; import org.elasticsearch.common.ParseField; import org.elasticsearch.common.ParseFieldMatcher; +import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.io.stream.NamedWriteable; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; @@ -43,8 +44,7 @@ import java.util.Objects; */ public abstract class SuggestionBuilder> extends ToXContentToBytes implements NamedWriteable { - // TODO this seems mandatory and should be constructor arg - protected String fieldname; + protected final String fieldname; protected String text; protected String prefix; protected String regex; @@ -60,6 +60,31 @@ public abstract class SuggestionBuilder> extends protected static final ParseField SIZE_FIELD = new ParseField("size"); protected static final ParseField SHARDSIZE_FIELD = new ParseField("shard_size"); + /** + * Creates a new suggestion. + * @param fieldname field to fetch the candidate suggestions from + */ + public SuggestionBuilder(String fieldname) { + Objects.requireNonNull(fieldname, "suggestion requires a field name"); + if (fieldname.isEmpty()) { + throw new IllegalArgumentException("suggestion field name is empty"); + } + this.fieldname = fieldname; + } + + /** + * internal copy constructor that copies over all class fields from second SuggestionBuilder except field name. + */ + protected SuggestionBuilder(String fieldname, SuggestionBuilder in) { + this(fieldname); + text = in.text; + prefix = in.prefix; + regex = in.regex; + analyzer = in.analyzer; + size = in.size; + shardSize = in.shardSize; + } + /** * Same as in {@link SuggestBuilder#setGlobalText(String)}, but in the suggestion scope. */ @@ -117,9 +142,7 @@ public abstract class SuggestionBuilder> extends if (analyzer != null) { builder.field(ANALYZER_FIELD.getPreferredName(), analyzer); } - if (fieldname != null) { - builder.field(FIELDNAME_FIELD.getPreferredName(), fieldname); - } + builder.field(FIELDNAME_FIELD.getPreferredName(), fieldname); if (size != null) { builder.field(SIZE_FIELD.getPreferredName(), size); } @@ -139,7 +162,7 @@ public abstract class SuggestionBuilder> extends XContentParser parser = parseContext.parser(); ParseFieldMatcher parsefieldMatcher = parseContext.parseFieldMatcher(); XContentParser.Token token; - String fieldName = null; + String currentFieldName = null; String suggestText = null; String prefix = null; String regex = null; @@ -147,21 +170,21 @@ public abstract class SuggestionBuilder> extends while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { - fieldName = parser.currentName(); + currentFieldName = parser.currentName(); } else if (token.isValue()) { - if (parsefieldMatcher.match(fieldName, TEXT_FIELD)) { + if (parsefieldMatcher.match(currentFieldName, TEXT_FIELD)) { suggestText = parser.text(); - } else if (parsefieldMatcher.match(fieldName, PREFIX_FIELD)) { + } else if (parsefieldMatcher.match(currentFieldName, PREFIX_FIELD)) { prefix = parser.text(); - } else if (parsefieldMatcher.match(fieldName, REGEX_FIELD)) { + } else if (parsefieldMatcher.match(currentFieldName, REGEX_FIELD)) { regex = parser.text(); } else { - throw new IllegalArgumentException("[suggestion] does not support [" + fieldName + "]"); + throw new ParsingException(parser.getTokenLocation(), "suggestion does not support [" + currentFieldName + "]"); } } else if (token == XContentParser.Token.START_OBJECT) { - SuggestionBuilder suggestParser = suggesters.getSuggestionPrototype(fieldName); + SuggestionBuilder suggestParser = suggesters.getSuggestionPrototype(currentFieldName); if (suggestParser == null) { - throw new IllegalArgumentException("Suggester[" + fieldName + "] not supported"); + throw new ParsingException(parser.getTokenLocation(), "suggestion [" + currentFieldName + "] not supported"); } suggestionBuilder = suggestParser.innerFromXContent(parseContext); } @@ -182,10 +205,6 @@ public abstract class SuggestionBuilder> extends public SuggestionContext build(QueryShardContext context) throws IOException { SuggestionContext suggestionContext = innerBuild(context); - // TODO make field mandatory in the builder, then remove this - if (suggestionContext.getField() == null) { - throw new IllegalArgumentException("The required field option is missing"); - } return suggestionContext; } @@ -254,20 +273,6 @@ public abstract class SuggestionBuilder> extends return getWriteableName(); } - - /** - * Sets from what field to fetch the candidate suggestions from. This is an - * required option and needs to be set via this setter or - * {@link org.elasticsearch.search.suggest.term.TermSuggestionBuilder#field(String)} - * method - */ - @SuppressWarnings("unchecked") - public T field(String field) { - Objects.requireNonNull(field, "fieldname must not be null"); - this.fieldname = field; - return (T)this; - } - /** * get the {@link #field()} parameter */ @@ -298,7 +303,7 @@ public abstract class SuggestionBuilder> extends @SuppressWarnings("unchecked") public T size(int size) { if (size <= 0) { - throw new IllegalArgumentException("Size must be positive"); + throw new IllegalArgumentException("size must be positive"); } this.size = size; return (T)this; @@ -339,8 +344,8 @@ public abstract class SuggestionBuilder> extends @Override public final T readFrom(StreamInput in) throws IOException { - T suggestionBuilder = doReadFrom(in); - suggestionBuilder.fieldname = in.readOptionalString(); + String fieldname = in.readString(); + T suggestionBuilder = doReadFrom(in, fieldname); suggestionBuilder.text = in.readOptionalString(); suggestionBuilder.prefix = in.readOptionalString(); suggestionBuilder.regex = in.readOptionalString(); @@ -353,13 +358,14 @@ public abstract class SuggestionBuilder> extends /** * Subclass should return a new instance, reading itself from the input string * @param in the input string to read from + * @param fieldname the fieldname needed for ctor or concrete suggestion */ - protected abstract T doReadFrom(StreamInput in) throws IOException; + protected abstract T doReadFrom(StreamInput in, String fieldname) throws IOException; @Override public final void writeTo(StreamOutput out) throws IOException { + out.writeString(fieldname); doWriteTo(out); - out.writeOptionalString(fieldname); out.writeOptionalString(text); out.writeOptionalString(prefix); out.writeOptionalString(regex); 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 d8c7ededb95..f2540e4862c 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 @@ -50,7 +50,7 @@ import java.util.Set; */ public class CompletionSuggestionBuilder extends SuggestionBuilder { - public static final CompletionSuggestionBuilder PROTOTYPE = new CompletionSuggestionBuilder(); + public static final CompletionSuggestionBuilder PROTOTYPE = new CompletionSuggestionBuilder("_na_"); static final String SUGGESTION_NAME = "completion"; static final ParseField PAYLOAD_FIELD = new ParseField("payload"); static final ParseField CONTEXTS_FIELD = new ParseField("contexts", "context"); @@ -60,6 +60,10 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder> queryContexts = new HashMap<>(); private final Set payloadFields = new HashSet<>(); + public CompletionSuggestionBuilder(String fieldname) { + super(fieldname); + } + /** * Sets the prefix to provide completions for. * The prefix gets analyzed by the suggest analyzer. @@ -229,8 +233,8 @@ public class CompletionSuggestionBuilder extends SuggestionBuilderphrase). */ -public final class PhraseSuggestionBuilder extends SuggestionBuilder { +public class PhraseSuggestionBuilder extends SuggestionBuilder { private static final String SUGGESTION_NAME = "phrase"; - public static final PhraseSuggestionBuilder PROTOTYPE = new PhraseSuggestionBuilder(); + public static final PhraseSuggestionBuilder PROTOTYPE = new PhraseSuggestionBuilder("_na_"); protected static final ParseField MAXERRORS_FIELD = new ParseField("max_errors"); protected static final ParseField RWE_LIKELIHOOD_FIELD = new ParseField("real_word_error_likelihood"); @@ -93,6 +94,32 @@ public final class PhraseSuggestionBuilder extends SuggestionBuilder> generators = new HashMap<>(); + public PhraseSuggestionBuilder(String fieldname) { + super(fieldname); + } + + /** + * 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 PhraseSuggestionBuilder(String fieldname, PhraseSuggestionBuilder in) { + super(fieldname, in); + maxErrors = in.maxErrors; + separator = in.separator; + realWordErrorLikelihood = in.realWordErrorLikelihood; + confidence = in.confidence; + gramSize = in.gramSize; + forceUnigrams = in.forceUnigrams; + tokenLimit = in.tokenLimit; + preTag = in.preTag; + postTag = in.postTag; + collateQuery = in.collateQuery; + collateParams = in.collateParams; + collatePrune = in.collatePrune; + model = in.model; + generators.putAll(in.generators); + } + /** * Sets the gram size for the n-gram model used for this suggester. The * default value is 1 corresponding to unigrams. Use @@ -395,102 +422,114 @@ public final class PhraseSuggestionBuilder extends SuggestionBuilder { - public static final TermSuggestionBuilder PROTOTYPE = new TermSuggestionBuilder(); + public static final TermSuggestionBuilder PROTOTYPE = new TermSuggestionBuilder("_na_"); private static final String SUGGESTION_NAME = "term"; private SuggestMode suggestMode = SuggestMode.MISSING; - private Float accuracy = DEFAULT_ACCURACY; + private float accuracy = DEFAULT_ACCURACY; private SortBy sort = SortBy.SCORE; private StringDistanceImpl stringDistance = StringDistanceImpl.INTERNAL; - private Integer maxEdits = DEFAULT_MAX_EDITS; - private Integer maxInspections = DEFAULT_MAX_INSPECTIONS; - private Float maxTermFreq = DEFAULT_MAX_TERM_FREQ; - private Integer prefixLength = DEFAULT_PREFIX_LENGTH; - private Integer minWordLength = DEFAULT_MIN_WORD_LENGTH; - private Float minDocFreq = DEFAULT_MIN_DOC_FREQ; + private int maxEdits = DEFAULT_MAX_EDITS; + private int maxInspections = DEFAULT_MAX_INSPECTIONS; + private float maxTermFreq = DEFAULT_MAX_TERM_FREQ; + private int prefixLength = DEFAULT_PREFIX_LENGTH; + private int minWordLength = DEFAULT_MIN_WORD_LENGTH; + private float minDocFreq = DEFAULT_MIN_DOC_FREQ; + + public TermSuggestionBuilder(String fieldname) { + super(fieldname); + } + + /** + * internal copy constructor that copies over all class field except fieldname. + */ + private TermSuggestionBuilder(String fieldname, TermSuggestionBuilder in) { + super(fieldname, in); + suggestMode = in.suggestMode; + accuracy = in.accuracy; + sort = in.sort; + stringDistance = in.stringDistance; + maxEdits = in.maxEdits; + maxInspections = in.maxInspections; + maxTermFreq = in.maxTermFreq; + prefixLength = in.prefixLength; + minWordLength = in.minWordLength; + minDocFreq = in.minDocFreq; + } /** * The global suggest mode controls what suggested terms are included or @@ -126,7 +148,7 @@ public class TermSuggestionBuilder extends SuggestionBuilder randomAsciiOfLengthBetween(2, 20))); break; @@ -322,15 +321,12 @@ public abstract class AbstractSuggestionBuilderTestCase randomAsciiOfLengthBetween(2, 20))); break; case 3: - mutation.field(randomValueOtherThan(mutation.field(), () -> randomAsciiOfLengthBetween(2, 20))); - break; - case 4: mutation.analyzer(randomValueOtherThan(mutation.analyzer(), () -> randomAsciiOfLengthBetween(2, 20))); break; - case 5: + case 4: mutation.size(randomValueOtherThan(mutation.size(), () -> randomIntBetween(1, 20))); break; - case 6: + case 5: mutation.shardSize(randomValueOtherThan(mutation.shardSize(), () -> randomIntBetween(1, 20))); break; } diff --git a/core/src/test/java/org/elasticsearch/search/suggest/CompletionSuggestSearchIT.java b/core/src/test/java/org/elasticsearch/search/suggest/CompletionSuggestSearchIT.java index 6813ebd6645..bfb31de216c 100644 --- a/core/src/test/java/org/elasticsearch/search/suggest/CompletionSuggestSearchIT.java +++ b/core/src/test/java/org/elasticsearch/search/suggest/CompletionSuggestSearchIT.java @@ -105,7 +105,7 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase { )); } indexRandom(true, indexRequestBuilders); - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg"); + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg"); assertSuggestions("foo", prefix, "suggestion10", "suggestion9", "suggestion8", "suggestion7", "suggestion6"); } @@ -126,7 +126,7 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase { )); } indexRandom(true, indexRequestBuilders); - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).regex("sugg.*es"); + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).regex("sugg.*es"); assertSuggestions("foo", prefix, "sugg10estion", "sugg9estion", "sugg8estion", "sugg7estion", "sugg6estion"); } @@ -147,7 +147,7 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase { )); } indexRandom(true, indexRequestBuilders); - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg", Fuzziness.ONE); + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg", Fuzziness.ONE); assertSuggestions("foo", prefix, "sugxgestion10", "sugxgestion9", "sugxgestion8", "sugxgestion7", "sugxgestion6"); } @@ -173,13 +173,13 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase { for (int i = 0; i < size; i++) { outputs[i] = "suggestion" + (numDocs - i); } - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sug").size(size); + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sug").size(size); assertSuggestions("foo", prefix, outputs); - CompletionSuggestionBuilder regex = SuggestBuilders.completionSuggestion().field(FIELD).regex("su[g|s]g").size(size); + CompletionSuggestionBuilder regex = SuggestBuilders.completionSuggestion(FIELD).regex("su[g|s]g").size(size); assertSuggestions("foo", regex, outputs); - CompletionSuggestionBuilder fuzzyPrefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg", Fuzziness.ONE).size(size); + CompletionSuggestionBuilder fuzzyPrefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg", Fuzziness.ONE).size(size); assertSuggestions("foo", fuzzyPrefix, outputs); } @@ -198,7 +198,7 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase { } indexRandom(true, indexRequestBuilders); - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg"). + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg"). size(numDocs).payload(Collections.singletonList("count")); SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", prefix).execute().actionGet(); assertNoFailures(suggestResponse); @@ -245,7 +245,7 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase { client().prepareIndex(INDEX, TYPE, "2").setSource(FIELD, "suggestion") ); indexRandom(true, indexRequestBuilders); - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg") + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg") .payload(Collections.singletonList("test_field")); SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", prefix).execute().actionGet(); assertNoFailures(suggestResponse); @@ -283,7 +283,7 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase { indexRequestBuilders.add(client().prepareIndex(INDEX, TYPE, "2").setSource(source)); indexRandom(true, indexRequestBuilders); - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg") + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg") .payload(Arrays.asList("title", "count")); SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", prefix).execute().actionGet(); assertNoFailures(suggestResponse); @@ -334,7 +334,7 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase { payloadFields.add("test_field" + i); } - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg") + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg") .size(suggestionSize).payload(payloadFields); SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", prefix).execute().actionGet(); assertNoFailures(suggestResponse); @@ -435,7 +435,7 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase { refresh(); SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("testSuggestions", - new CompletionSuggestionBuilder().field(FIELD).text("test").size(10) + new CompletionSuggestionBuilder(FIELD).text("test").size(10) ).execute().actionGet(); assertSuggestions(suggestResponse, "testSuggestions", "testing"); @@ -636,7 +636,7 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase { assertThat(putMappingResponse.isAcknowledged(), is(true)); SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("suggs", - SuggestBuilders.completionSuggestion().field(FIELD + ".suggest").text("f").size(10) + SuggestBuilders.completionSuggestion(FIELD + ".suggest").text("f").size(10) ).execute().actionGet(); assertSuggestions(suggestResponse, "suggs"); @@ -644,7 +644,7 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase { ensureGreen(INDEX); SuggestResponse afterReindexingResponse = client().prepareSuggest(INDEX).addSuggestion("suggs", - SuggestBuilders.completionSuggestion().field(FIELD + ".suggest").text("f").size(10) + SuggestBuilders.completionSuggestion(FIELD + ".suggest").text("f").size(10) ).execute().actionGet(); assertSuggestions(afterReindexingResponse, "suggs", "Foo Fighters"); } @@ -661,12 +661,12 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase { refresh(); SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", - SuggestBuilders.completionSuggestion().field(FIELD).prefix("Nirv").size(10) + SuggestBuilders.completionSuggestion(FIELD).prefix("Nirv").size(10) ).execute().actionGet(); assertSuggestions(suggestResponse, false, "foo", "Nirvana"); suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", - SuggestBuilders.completionSuggestion().field(FIELD).prefix("Nirw", Fuzziness.ONE).size(10) + SuggestBuilders.completionSuggestion(FIELD).prefix("Nirw", Fuzziness.ONE).size(10) ).execute().actionGet(); assertSuggestions(suggestResponse, false, "foo", "Nirvana"); } @@ -684,13 +684,13 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase { // edit distance 1 SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", - SuggestBuilders.completionSuggestion().field(FIELD).prefix("Norw", Fuzziness.ONE).size(10) + SuggestBuilders.completionSuggestion(FIELD).prefix("Norw", Fuzziness.ONE).size(10) ).execute().actionGet(); assertSuggestions(suggestResponse, false, "foo"); // edit distance 2 suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", - SuggestBuilders.completionSuggestion().field(FIELD).prefix("Norw", Fuzziness.TWO).size(10) + SuggestBuilders.completionSuggestion(FIELD).prefix("Norw", Fuzziness.TWO).size(10) ).execute().actionGet(); assertSuggestions(suggestResponse, false, "foo", "Nirvana"); } @@ -707,12 +707,12 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase { refresh(); SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", - SuggestBuilders.completionSuggestion().field(FIELD).prefix("Nriv", FuzzyOptions.builder().setTranspositions(false).build()).size(10) + SuggestBuilders.completionSuggestion(FIELD).prefix("Nriv", FuzzyOptions.builder().setTranspositions(false).build()).size(10) ).execute().actionGet(); assertSuggestions(suggestResponse, false, "foo"); suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", - SuggestBuilders.completionSuggestion().field(FIELD).prefix("Nriv", Fuzziness.ONE).size(10) + SuggestBuilders.completionSuggestion(FIELD).prefix("Nriv", Fuzziness.ONE).size(10) ).execute().actionGet(); assertSuggestions(suggestResponse, false, "foo", "Nirvana"); } @@ -729,12 +729,12 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase { refresh(); SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", - SuggestBuilders.completionSuggestion().field(FIELD).prefix("Nriva", FuzzyOptions.builder().setFuzzyMinLength(6).build()).size(10) + SuggestBuilders.completionSuggestion(FIELD).prefix("Nriva", FuzzyOptions.builder().setFuzzyMinLength(6).build()).size(10) ).execute().actionGet(); assertSuggestions(suggestResponse, false, "foo"); suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", - SuggestBuilders.completionSuggestion().field(FIELD).prefix("Nrivan", FuzzyOptions.builder().setFuzzyMinLength(6).build()).size(10) + SuggestBuilders.completionSuggestion(FIELD).prefix("Nrivan", FuzzyOptions.builder().setFuzzyMinLength(6).build()).size(10) ).execute().actionGet(); assertSuggestions(suggestResponse, false, "foo", "Nirvana"); } @@ -751,12 +751,12 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase { refresh(); SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", - SuggestBuilders.completionSuggestion().field(FIELD).prefix("Nirw", FuzzyOptions.builder().setFuzzyPrefixLength(4).build()).size(10) + SuggestBuilders.completionSuggestion(FIELD).prefix("Nirw", FuzzyOptions.builder().setFuzzyPrefixLength(4).build()).size(10) ).execute().actionGet(); assertSuggestions(suggestResponse, false, "foo"); suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", - SuggestBuilders.completionSuggestion().field(FIELD).prefix("Nirvo", FuzzyOptions.builder().setFuzzyPrefixLength(4).build()).size(10) + SuggestBuilders.completionSuggestion(FIELD).prefix("Nirvo", FuzzyOptions.builder().setFuzzyPrefixLength(4).build()).size(10) ).execute().actionGet(); assertSuggestions(suggestResponse, false, "foo", "Nirvana"); } @@ -774,18 +774,18 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase { // suggestion with a character, which needs unicode awareness org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder completionSuggestionBuilder = - SuggestBuilders.completionSuggestion().field(FIELD).prefix("öööи", FuzzyOptions.builder().setUnicodeAware(true).build()).size(10); + SuggestBuilders.completionSuggestion(FIELD).prefix("öööи", FuzzyOptions.builder().setUnicodeAware(true).build()).size(10); SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", completionSuggestionBuilder).execute().actionGet(); assertSuggestions(suggestResponse, false, "foo", "ööööö"); // removing unicode awareness leads to no result - completionSuggestionBuilder = SuggestBuilders.completionSuggestion().field(FIELD).prefix("öööи", FuzzyOptions.builder().setUnicodeAware(false).build()).size(10); + completionSuggestionBuilder = SuggestBuilders.completionSuggestion(FIELD).prefix("öööи", FuzzyOptions.builder().setUnicodeAware(false).build()).size(10); suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", completionSuggestionBuilder).execute().actionGet(); assertSuggestions(suggestResponse, false, "foo"); // increasing edit distance instead of unicode awareness works again, as this is only a single character - completionSuggestionBuilder = SuggestBuilders.completionSuggestion().field(FIELD).prefix("öööи", FuzzyOptions.builder().setUnicodeAware(false).setFuzziness(Fuzziness.TWO).build()).size(10); + completionSuggestionBuilder = SuggestBuilders.completionSuggestion(FIELD).prefix("öööи", FuzzyOptions.builder().setUnicodeAware(false).setFuzziness(Fuzziness.TWO).build()).size(10); suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", completionSuggestionBuilder).execute().actionGet(); assertSuggestions(suggestResponse, false, "foo", "ööööö"); } @@ -815,8 +815,8 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase { refresh(); ensureGreen(); // load the fst index into ram - client().prepareSuggest(INDEX).addSuggestion("foo", SuggestBuilders.completionSuggestion().field(FIELD).prefix("f")).get(); - client().prepareSuggest(INDEX).addSuggestion("foo", SuggestBuilders.completionSuggestion().field(otherField).prefix("f")).get(); + client().prepareSuggest(INDEX).addSuggestion("foo", SuggestBuilders.completionSuggestion(FIELD).prefix("f")).get(); + client().prepareSuggest(INDEX).addSuggestion("foo", SuggestBuilders.completionSuggestion(otherField).prefix("f")).get(); // Get all stats IndicesStatsResponse indicesStatsResponse = client().admin().indices().prepareStats(INDEX).setIndices(INDEX).setCompletion(true).get(); @@ -921,14 +921,14 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase { } public void assertSuggestions(String suggestion, String... suggestions) { String suggestionName = RandomStrings.randomAsciiOfLength(random(), 10); - CompletionSuggestionBuilder suggestionBuilder = SuggestBuilders.completionSuggestion().field(FIELD).text(suggestion).size(10); + CompletionSuggestionBuilder suggestionBuilder = SuggestBuilders.completionSuggestion(FIELD).text(suggestion).size(10); assertSuggestions(suggestionName, suggestionBuilder, suggestions); } public void assertSuggestionsNotInOrder(String suggestString, String... suggestions) { String suggestionName = RandomStrings.randomAsciiOfLength(random(), 10); SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(suggestionName, - SuggestBuilders.completionSuggestion().field(FIELD).text(suggestString).size(10) + SuggestBuilders.completionSuggestion(FIELD).text(suggestString).size(10) ).execute().actionGet(); assertSuggestions(suggestResponse, false, suggestionName, suggestions); diff --git a/core/src/test/java/org/elasticsearch/search/suggest/ContextCompletionSuggestSearchIT.java b/core/src/test/java/org/elasticsearch/search/suggest/ContextCompletionSuggestSearchIT.java index bffba38dd15..fa552172b66 100644 --- a/core/src/test/java/org/elasticsearch/search/suggest/ContextCompletionSuggestSearchIT.java +++ b/core/src/test/java/org/elasticsearch/search/suggest/ContextCompletionSuggestSearchIT.java @@ -90,7 +90,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase { } indexRandom(true, indexRequestBuilders); ensureYellow(INDEX); - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg"); + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg"); assertSuggestions("foo", prefix, "suggestion9", "suggestion8", "suggestion7", "suggestion6", "suggestion5"); } @@ -122,7 +122,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase { } indexRandom(true, indexRequestBuilders); ensureYellow(INDEX); - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).regex("sugg.*es"); + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).regex("sugg.*es"); assertSuggestions("foo", prefix, "sugg9estion", "sugg8estion", "sugg7estion", "sugg6estion", "sugg5estion"); } @@ -154,7 +154,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase { } indexRandom(true, indexRequestBuilders); ensureYellow(INDEX); - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg", Fuzziness.ONE); + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg", Fuzziness.ONE); assertSuggestions("foo", prefix, "sugxgestion9", "sugxgestion8", "sugxgestion7", "sugxgestion6", "sugxgestion5"); } @@ -179,7 +179,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase { } indexRandom(true, indexRequestBuilders); ensureYellow(INDEX); - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg") + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg") .categoryContexts("cat", CategoryQueryContext.builder().setCategory("cat0").build()); assertSuggestions("foo", prefix, "suggestion8", "suggestion6", "suggestion4", "suggestion2", "suggestion0"); @@ -206,7 +206,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase { } indexRandom(true, indexRequestBuilders); ensureYellow(INDEX); - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg") + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg") .categoryContexts("cat", CategoryQueryContext.builder().setCategory("cat0").setBoost(3).build(), CategoryQueryContext.builder().setCategory("cat1").build() @@ -236,7 +236,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase { } indexRandom(true, indexRequestBuilders); ensureYellow(INDEX); - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg"); + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg"); assertSuggestions("foo", prefix, "suggestion9", "suggestion8", "suggestion7", "suggestion6", "suggestion5"); } @@ -266,17 +266,17 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase { ensureYellow(INDEX); // filter only on context cat - CompletionSuggestionBuilder catFilterSuggest = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg"); + CompletionSuggestionBuilder catFilterSuggest = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg"); catFilterSuggest.categoryContexts("cat", CategoryQueryContext.builder().setCategory("cat0").build()); assertSuggestions("foo", catFilterSuggest, "suggestion8", "suggestion6", "suggestion4", "suggestion2", "suggestion0"); // filter only on context type - CompletionSuggestionBuilder typeFilterSuggest = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg"); + CompletionSuggestionBuilder typeFilterSuggest = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg"); typeFilterSuggest.categoryContexts("type", CategoryQueryContext.builder().setCategory("type2").build(), CategoryQueryContext.builder().setCategory("type1").build()); assertSuggestions("foo", typeFilterSuggest, "suggestion9", "suggestion6", "suggestion5", "suggestion2", "suggestion1"); - CompletionSuggestionBuilder multiContextFilterSuggest = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg"); + CompletionSuggestionBuilder multiContextFilterSuggest = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg"); // query context order should never matter if (randomBoolean()) { multiContextFilterSuggest.categoryContexts("type", CategoryQueryContext.builder().setCategory("type2").build()); @@ -314,21 +314,21 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase { ensureYellow(INDEX); // boost only on context cat - CompletionSuggestionBuilder catBoostSuggest = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg"); + CompletionSuggestionBuilder catBoostSuggest = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg"); catBoostSuggest.categoryContexts("cat", CategoryQueryContext.builder().setCategory("cat0").setBoost(3).build(), CategoryQueryContext.builder().setCategory("cat1").build()); assertSuggestions("foo", catBoostSuggest, "suggestion8", "suggestion6", "suggestion4", "suggestion9", "suggestion2"); // boost only on context type - CompletionSuggestionBuilder typeBoostSuggest = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg"); + CompletionSuggestionBuilder typeBoostSuggest = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg"); typeBoostSuggest.categoryContexts("type", CategoryQueryContext.builder().setCategory("type2").setBoost(2).build(), CategoryQueryContext.builder().setCategory("type1").setBoost(4).build()); assertSuggestions("foo", typeBoostSuggest, "suggestion9", "suggestion5", "suggestion6", "suggestion1", "suggestion2"); // boost on both contexts - CompletionSuggestionBuilder multiContextBoostSuggest = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg"); + CompletionSuggestionBuilder multiContextBoostSuggest = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg"); // query context order should never matter if (randomBoolean()) { multiContextBoostSuggest.categoryContexts("type", @@ -375,7 +375,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase { } indexRandom(true, indexRequestBuilders); ensureYellow(INDEX); - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg"); + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg"); assertSuggestions("foo", prefix, "suggestion9", "suggestion8", "suggestion7", "suggestion6", "suggestion5"); } @@ -406,7 +406,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase { indexRandom(true, indexRequestBuilders); ensureYellow(INDEX); - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg"); + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg"); assertSuggestions("foo", prefix, "suggestion0", "suggestion1", "suggestion2", "suggestion3", "suggestion4"); } @@ -432,7 +432,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase { } indexRandom(true, indexRequestBuilders); ensureYellow(INDEX); - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg"); + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg"); assertSuggestions("foo", prefix, "suggestion9", "suggestion8", "suggestion7", "suggestion6", "suggestion5"); } @@ -459,10 +459,10 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase { } indexRandom(true, indexRequestBuilders); ensureYellow(INDEX); - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg"); + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg"); assertSuggestions("foo", prefix, "suggestion9", "suggestion8", "suggestion7", "suggestion6", "suggestion5"); - CompletionSuggestionBuilder geoFilteringPrefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg") + CompletionSuggestionBuilder geoFilteringPrefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg") .geoContexts("geo", GeoQueryContext.builder().setGeoPoint(new GeoPoint(geoPoints[0])).build()); assertSuggestions("foo", geoFilteringPrefix, "suggestion8", "suggestion6", "suggestion4", "suggestion2", "suggestion0"); @@ -491,12 +491,12 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase { } indexRandom(true, indexRequestBuilders); ensureYellow(INDEX); - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg"); + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg"); assertSuggestions("foo", prefix, "suggestion9", "suggestion8", "suggestion7", "suggestion6", "suggestion5"); GeoQueryContext context1 = GeoQueryContext.builder().setGeoPoint(geoPoints[0]).setBoost(2).build(); GeoQueryContext context2 = GeoQueryContext.builder().setGeoPoint(geoPoints[1]).build(); - CompletionSuggestionBuilder geoBoostingPrefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg") + CompletionSuggestionBuilder geoBoostingPrefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg") .geoContexts("geo", context1, context2); assertSuggestions("foo", geoBoostingPrefix, "suggestion8", "suggestion6", "suggestion4", "suggestion9", "suggestion7"); @@ -527,7 +527,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase { } indexRandom(true, indexRequestBuilders); ensureYellow(INDEX); - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg") + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg") .geoContexts("geo", GeoQueryContext.builder().setGeoPoint(new GeoPoint(52.2263, 4.543)).build()); assertSuggestions("foo", prefix, "suggestion9", "suggestion8", "suggestion7", "suggestion6", "suggestion5"); } @@ -565,10 +565,10 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase { } indexRandom(true, indexRequestBuilders); ensureYellow(INDEX); - CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg"); + CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg"); assertSuggestions("foo", prefix, "suggestion9", "suggestion8", "suggestion7", "suggestion6", "suggestion5"); - CompletionSuggestionBuilder geoNeighbourPrefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg") + CompletionSuggestionBuilder geoNeighbourPrefix = SuggestBuilders.completionSuggestion(FIELD).prefix("sugg") .geoContexts("geo", GeoQueryContext.builder().setGeoPoint(GeoPoint.fromGeohash(geohash)).build()); assertSuggestions("foo", geoNeighbourPrefix, "suggestion9", "suggestion8", "suggestion7", "suggestion6", "suggestion5"); @@ -625,7 +625,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase { refresh(); String suggestionName = randomAsciiOfLength(10); - CompletionSuggestionBuilder context = SuggestBuilders.completionSuggestion().field(FIELD).text("h").size(10) + CompletionSuggestionBuilder context = SuggestBuilders.completionSuggestion(FIELD).text("h").size(10) .geoContexts("st", GeoQueryContext.builder().setGeoPoint(new GeoPoint(52.52, 13.4)).build()); SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(suggestionName, context).get(); diff --git a/core/src/test/java/org/elasticsearch/search/suggest/CustomSuggesterSearchIT.java b/core/src/test/java/org/elasticsearch/search/suggest/CustomSuggesterSearchIT.java index ca8d4fa862e..178e353b7a9 100644 --- a/core/src/test/java/org/elasticsearch/search/suggest/CustomSuggesterSearchIT.java +++ b/core/src/test/java/org/elasticsearch/search/suggest/CustomSuggesterSearchIT.java @@ -86,17 +86,15 @@ public class CustomSuggesterSearchIT extends ESIntegTestCase { public final static CustomSuggestionBuilder PROTOTYPE = new CustomSuggestionBuilder("_na_", "_na_"); - private String randomField; private String randomSuffix; public CustomSuggestionBuilder(String randomField, String randomSuffix) { - this.randomField = randomField; + super(randomField); this.randomSuffix = randomSuffix; } @Override protected XContentBuilder innerToXContent(XContentBuilder builder, Params params) throws IOException { - builder.field("field", randomField); builder.field("suffix", randomSuffix); return builder; } @@ -108,39 +106,39 @@ public class CustomSuggesterSearchIT extends ESIntegTestCase { @Override public void doWriteTo(StreamOutput out) throws IOException { - out.writeString(randomField); out.writeString(randomSuffix); } @Override - public CustomSuggestionBuilder doReadFrom(StreamInput in) throws IOException { - return new CustomSuggestionBuilder(in.readString(), in.readString()); + public CustomSuggestionBuilder doReadFrom(StreamInput in, String fieldname) throws IOException { + return new CustomSuggestionBuilder(fieldname, in.readString()); } @Override protected boolean doEquals(CustomSuggestionBuilder other) { - return Objects.equals(randomField, other.randomField) && - Objects.equals(randomSuffix, other.randomSuffix); + return Objects.equals(randomSuffix, other.randomSuffix); } @Override protected int doHashCode() { - return Objects.hash(randomField, randomSuffix); + return Objects.hash(randomSuffix); } @Override protected CustomSuggestionBuilder innerFromXContent(QueryParseContext parseContext) throws IOException { // TODO some parsing - return new CustomSuggestionBuilder(randomField, randomSuffix); + return new CustomSuggestionBuilder(field(), randomSuffix); } @Override protected SuggestionContext innerBuild(QueryShardContext context) throws IOException { Map options = new HashMap<>(); - options.put("field", randomField); + options.put("field", field()); options.put("suffix", randomSuffix); - return new CustomSuggester.CustomSuggestionsContext(context, options); + CustomSuggester.CustomSuggestionsContext customSuggestionsContext = new CustomSuggester.CustomSuggestionsContext(context, options); + customSuggestionsContext.setField(field()); + return customSuggestionsContext; } } diff --git a/core/src/test/java/org/elasticsearch/search/suggest/completion/CompletionSuggesterBuilderTests.java b/core/src/test/java/org/elasticsearch/search/suggest/completion/CompletionSuggesterBuilderTests.java index 58e719dcaa2..c5547163d27 100644 --- a/core/src/test/java/org/elasticsearch/search/suggest/completion/CompletionSuggesterBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/search/suggest/completion/CompletionSuggesterBuilderTests.java @@ -42,7 +42,7 @@ public class CompletionSuggesterBuilderTests extends AbstractSuggestionBuilderTe @Override protected CompletionSuggestionBuilder randomSuggestionBuilder() { - CompletionSuggestionBuilder testBuilder = new CompletionSuggestionBuilder(); + CompletionSuggestionBuilder testBuilder = new CompletionSuggestionBuilder(randomAsciiOfLengthBetween(2, 20)); switch (randomIntBetween(0, 3)) { case 0: testBuilder.prefix(randomAsciiOfLength(10)); diff --git a/core/src/test/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestionBuilderTests.java b/core/src/test/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestionBuilderTests.java index cedbb91fc61..3011acee57a 100644 --- a/core/src/test/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestionBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestionBuilderTests.java @@ -47,7 +47,7 @@ public class PhraseSuggestionBuilderTests extends AbstractSuggestionBuilderTestC } public static PhraseSuggestionBuilder randomPhraseSuggestionBuilder() { - PhraseSuggestionBuilder testBuilder = new PhraseSuggestionBuilder(); + PhraseSuggestionBuilder testBuilder = new PhraseSuggestionBuilder(randomAsciiOfLengthBetween(2, 20)); maybeSet(testBuilder::maxErrors, randomFloat()); maybeSet(testBuilder::separator, randomAsciiOfLengthBetween(1, 10)); maybeSet(testBuilder::realWordErrorLikelihood, randomFloat()); @@ -193,4 +193,83 @@ public class PhraseSuggestionBuilderTests extends AbstractSuggestionBuilderTestC } } + public void testInvalidParameters() throws IOException { + // test missing field name + try { + new PhraseSuggestionBuilder(null); + fail("Should not allow null as field name"); + } catch (NullPointerException e) { + assertEquals("suggestion requires a field name", e.getMessage()); + } + + // test emtpy field name + try { + new PhraseSuggestionBuilder(""); + fail("Should not allow empty string as field name"); + } catch (IllegalArgumentException e) { + assertEquals("suggestion field name is empty", e.getMessage()); + } + + PhraseSuggestionBuilder builder = new PhraseSuggestionBuilder(randomAsciiOfLengthBetween(2, 20)); + try { + builder.gramSize(0); + fail("Should not allow gramSize < 1"); + } catch (IllegalArgumentException e) { + assertEquals("gramSize must be >= 1", e.getMessage()); + } + + try { + builder.gramSize(-1); + fail("Should not allow gramSize < 1"); + } catch (IllegalArgumentException e) { + assertEquals("gramSize must be >= 1", e.getMessage()); + } + + try { + builder.maxErrors(-1); + fail("Should not allow maxErrors < 0"); + } catch (IllegalArgumentException e) { + assertEquals("max_error must be > 0.0", e.getMessage()); + } + + try { + builder.separator(null); + fail("Should not allow null as separator"); + } catch (NullPointerException e) { + assertEquals("separator cannot be set to null", e.getMessage()); + } + + try { + builder.realWordErrorLikelihood(-1); + fail("Should not allow real world error likelihood < 0"); + } catch (IllegalArgumentException e) { + assertEquals("real_word_error_likelihood must be > 0.0", e.getMessage()); + } + + try { + builder.confidence(-1); + fail("Should not allow confidence < 0"); + } catch (IllegalArgumentException e) { + assertEquals("confidence must be >= 0.0", e.getMessage()); + } + + try { + builder.tokenLimit(0); + fail("token_limit must be >= 1"); + } catch (IllegalArgumentException e) { + assertEquals("token_limit must be >= 1", e.getMessage()); + } + + try { + if (randomBoolean()) { + builder.highlight(null, ""); + } else { + builder.highlight("", null); + } + fail("Pre and post tag must both be null or both not be null."); + } catch (IllegalArgumentException e) { + assertEquals("Pre and post tag must both be null or both not be null.", e.getMessage()); + } + } + } diff --git a/core/src/test/java/org/elasticsearch/search/suggest/term/TermSuggestionBuilderTests.java b/core/src/test/java/org/elasticsearch/search/suggest/term/TermSuggestionBuilderTests.java index ee0e92279d7..e0c2a33664a 100644 --- a/core/src/test/java/org/elasticsearch/search/suggest/term/TermSuggestionBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/search/suggest/term/TermSuggestionBuilderTests.java @@ -28,7 +28,13 @@ import org.elasticsearch.search.suggest.term.TermSuggestionBuilder.SuggestMode; import java.io.IOException; -import static org.hamcrest.Matchers.notNullValue; +import static org.elasticsearch.search.suggest.DirectSpellcheckerSettings.DEFAULT_ACCURACY; +import static org.elasticsearch.search.suggest.DirectSpellcheckerSettings.DEFAULT_MAX_EDITS; +import static org.elasticsearch.search.suggest.DirectSpellcheckerSettings.DEFAULT_MAX_INSPECTIONS; +import static org.elasticsearch.search.suggest.DirectSpellcheckerSettings.DEFAULT_MAX_TERM_FREQ; +import static org.elasticsearch.search.suggest.DirectSpellcheckerSettings.DEFAULT_MIN_DOC_FREQ; +import static org.elasticsearch.search.suggest.DirectSpellcheckerSettings.DEFAULT_MIN_WORD_LENGTH; +import static org.elasticsearch.search.suggest.DirectSpellcheckerSettings.DEFAULT_PREFIX_LENGTH; /** * Test the {@link TermSuggestionBuilder} class. @@ -40,7 +46,7 @@ public class TermSuggestionBuilderTests extends AbstractSuggestionBuilderTestCas */ @Override protected TermSuggestionBuilder randomSuggestionBuilder() { - TermSuggestionBuilder testBuilder = new TermSuggestionBuilder(); + TermSuggestionBuilder testBuilder = new TermSuggestionBuilder(randomAsciiOfLengthBetween(2, 20)); maybeSet(testBuilder::suggestMode, randomSuggestMode()); maybeSet(testBuilder::accuracy, randomFloat()); maybeSet(testBuilder::sort, randomSort()); @@ -124,7 +130,23 @@ public class TermSuggestionBuilderTests extends AbstractSuggestionBuilderTestCas } public void testInvalidParameters() throws IOException { - TermSuggestionBuilder builder = new TermSuggestionBuilder(); + // test missing field name + try { + new TermSuggestionBuilder(null); + fail("Should not allow null as field name"); + } catch (NullPointerException e) { + assertEquals("suggestion requires a field name", e.getMessage()); + } + + // test emtpy field name + try { + new TermSuggestionBuilder(""); + fail("Should not allow empty string as field name"); + } catch (IllegalArgumentException e) { + assertEquals("suggestion field name is empty", e.getMessage()); + } + + TermSuggestionBuilder builder = new TermSuggestionBuilder(randomAsciiOfLengthBetween(2, 20)); // test invalid accuracy values try { builder.accuracy(-0.5f); @@ -237,17 +259,17 @@ public class TermSuggestionBuilderTests extends AbstractSuggestionBuilderTestCas } public void testDefaultValuesSet() { - TermSuggestionBuilder builder = new TermSuggestionBuilder(); - assertThat(builder.accuracy(), notNullValue()); - assertThat(builder.maxEdits(), notNullValue()); - assertThat(builder.maxInspections(), notNullValue()); - assertThat(builder.maxTermFreq(), notNullValue()); - assertThat(builder.minDocFreq(), notNullValue()); - assertThat(builder.minWordLength(), notNullValue()); - assertThat(builder.prefixLength(), notNullValue()); - assertThat(builder.sort(), notNullValue()); - assertThat(builder.stringDistance(), notNullValue()); - assertThat(builder.suggestMode(), notNullValue()); + TermSuggestionBuilder builder = new TermSuggestionBuilder(randomAsciiOfLengthBetween(2, 20)); + assertEquals(DEFAULT_ACCURACY, builder.accuracy(), Float.MIN_VALUE); + assertEquals(DEFAULT_MAX_EDITS, builder.maxEdits()); + assertEquals(DEFAULT_MAX_INSPECTIONS, builder.maxInspections()); + assertEquals(DEFAULT_MAX_TERM_FREQ, builder.maxTermFreq(), Float.MIN_VALUE); + assertEquals(DEFAULT_MIN_DOC_FREQ, builder.minDocFreq(), Float.MIN_VALUE); + assertEquals(DEFAULT_MIN_WORD_LENGTH, builder.minWordLength()); + assertEquals(DEFAULT_PREFIX_LENGTH, builder.prefixLength()); + assertEquals(SortBy.SCORE, builder.sort()); + assertEquals(StringDistanceImpl.INTERNAL, builder.stringDistance()); + assertEquals(SuggestMode.MISSING, builder.suggestMode()); } @Override diff --git a/docs/reference/migration/migrate_5_0.asciidoc b/docs/reference/migration/migrate_5_0.asciidoc index a87719e2c89..ac6f418fad2 100644 --- a/docs/reference/migration/migrate_5_0.asciidoc +++ b/docs/reference/migration/migrate_5_0.asciidoc @@ -671,6 +671,13 @@ The inner DirectCandidateGenerator class has been moved out to its own class cal The `setText` method has been changed to `setGlobalText` to make the intent more clear, and a `getGlobalText` method has been added. +The `addSuggestion` method now required the user specified suggestion name, previously used in the ctor of each +suggestion. + +=== SuggestionBuilder + +The `field` setter has been deleted. Instead the field name needs to be specified as constructor argument. + ==== Elasticsearch will no longer detect logging implementations Elasticsearch now logs only to log4j 1.2. Previously if log4j wasn't on the classpath it made some effort to degrade to diff --git a/modules/lang-mustache/src/test/java/org/elasticsearch/messy/tests/SuggestSearchTests.java b/modules/lang-mustache/src/test/java/org/elasticsearch/messy/tests/SuggestSearchTests.java index c828013f762..cdafa3363cc 100644 --- a/modules/lang-mustache/src/test/java/org/elasticsearch/messy/tests/SuggestSearchTests.java +++ b/modules/lang-mustache/src/test/java/org/elasticsearch/messy/tests/SuggestSearchTests.java @@ -20,38 +20,6 @@ package org.elasticsearch.messy.tests; -import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_REPLICAS; -import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_SHARDS; -import static org.elasticsearch.common.settings.Settings.settingsBuilder; -import static org.elasticsearch.index.query.QueryBuilders.matchQuery; -import static org.elasticsearch.search.suggest.SuggestBuilders.phraseSuggestion; -import static org.elasticsearch.search.suggest.SuggestBuilders.termSuggestion; -import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; -import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertNoFailures; -import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSuggestion; -import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSuggestionPhraseCollateMatchExists; -import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSuggestionSize; -import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertThrows; -import static org.hamcrest.Matchers.anyOf; -import static org.hamcrest.Matchers.endsWith; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.instanceOf; -import static org.hamcrest.Matchers.nullValue; - -import java.io.IOException; -import java.net.URISyntaxException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.ExecutionException; - import org.elasticsearch.ElasticsearchException; import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder; import org.elasticsearch.action.index.IndexRequestBuilder; @@ -81,6 +49,38 @@ import org.elasticsearch.search.suggest.term.TermSuggestionBuilder.SuggestMode; import org.elasticsearch.test.ESIntegTestCase; import org.elasticsearch.test.hamcrest.ElasticsearchAssertions; +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.ExecutionException; + +import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_REPLICAS; +import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_SHARDS; +import static org.elasticsearch.common.settings.Settings.settingsBuilder; +import static org.elasticsearch.index.query.QueryBuilders.matchQuery; +import static org.elasticsearch.search.suggest.SuggestBuilders.phraseSuggestion; +import static org.elasticsearch.search.suggest.SuggestBuilders.termSuggestion; +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertNoFailures; +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSuggestion; +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSuggestionPhraseCollateMatchExists; +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSuggestionSize; +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertThrows; +import static org.hamcrest.Matchers.anyOf; +import static org.hamcrest.Matchers.endsWith; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.nullValue; + /** * Integration tests for term and phrase suggestions. Many of these tests many requests that vary only slightly from one another. Where * possible these tests should declare for the first request, make the request, modify the configuration for the next request, make that @@ -104,10 +104,9 @@ public class SuggestSearchTests extends ESIntegTestCase { index("test", "type1", "4", "text", "abcc"); refresh(); - TermSuggestionBuilder termSuggest = termSuggestion() + TermSuggestionBuilder termSuggest = termSuggestion("text") .suggestMode(TermSuggestionBuilder.SuggestMode.ALWAYS) // Always, otherwise the results can vary between requests. - .text("abcd") - .field("text"); + .text("abcd"); logger.info("--> run suggestions with one index"); searchSuggest("test", termSuggest); createIndex("test_1"); @@ -118,11 +117,10 @@ public class SuggestSearchTests extends ESIntegTestCase { index("test_1", "type1", "3", "text", "ab bd"); index("test_1", "type1", "4", "text", "ab cc"); refresh(); - termSuggest = termSuggestion() + termSuggest = termSuggestion("text") .suggestMode(SuggestMode.ALWAYS) // Always, otherwise the results can vary between requests. .text("ab cd") - .minWordLength(1) - .field("text"); + .minWordLength(1); logger.info("--> run suggestions with two indices"); searchSuggest("test", termSuggest); @@ -145,11 +143,10 @@ public class SuggestSearchTests extends ESIntegTestCase { index("test_2", "type1", "4", "text", "abcc"); refresh(); - termSuggest = termSuggestion() + termSuggest = termSuggestion("text") .suggestMode(SuggestMode.ALWAYS) // Always, otherwise the results can vary between requests. .text("ab cd") - .minWordLength(1) - .field("text"); + .minWordLength(1); logger.info("--> run suggestions with three indices"); try { searchSuggest("test", termSuggest); @@ -165,11 +162,10 @@ public class SuggestSearchTests extends ESIntegTestCase { } - termSuggest = termSuggestion() + termSuggest = termSuggestion("text") .suggestMode(SuggestMode.ALWAYS) // Always, otherwise the results can vary between requests. .text("ABCD") - .minWordLength(1) - .field("text"); + .minWordLength(1); logger.info("--> run suggestions with four indices"); try { searchSuggest("test", termSuggest); @@ -219,7 +215,7 @@ public class SuggestSearchTests extends ESIntegTestCase { refresh(); DirectCandidateGeneratorBuilder generator = candidateGenerator("name").prefixLength(0).minWordLength(0).suggestMode("always").maxEdits(2); - PhraseSuggestionBuilder phraseSuggestion = phraseSuggestion().field("name.shingled") + PhraseSuggestionBuilder phraseSuggestion = phraseSuggestion("name.shingled") .addCandidateGenerator(generator) .gramSize(3); Suggest searchSuggest = searchSuggest("ice tea", "did_you_mean", phraseSuggestion); @@ -255,10 +251,9 @@ public class SuggestSearchTests extends ESIntegTestCase { SearchResponse search = client().prepareSearch().setQuery(matchQuery("text", "spellchecker")).get(); assertThat("didn't ask for suggestions but got some", search.getSuggest(), nullValue()); - TermSuggestionBuilder termSuggestion = termSuggestion() + TermSuggestionBuilder termSuggestion = termSuggestion("text") .suggestMode(SuggestMode.ALWAYS) // Always, otherwise the results can vary between requests. .text("abcd") - .field("text") .size(10); Suggest suggest = searchSuggest("test", termSuggestion); assertSuggestion(suggest, 0, "test", 10, "abc0"); @@ -298,13 +293,15 @@ public class SuggestSearchTests extends ESIntegTestCase { client().prepareIndex("test", "type1").setSource("name", "I like ice cream.")); refresh(); - PhraseSuggestionBuilder phraseSuggestion = phraseSuggestion().field("name.shingled") + PhraseSuggestionBuilder phraseSuggestion = phraseSuggestion("name.shingled") .addCandidateGenerator(candidateGenerator("name").prefixLength(0).minWordLength(0).suggestMode("always").maxEdits(2)) .gramSize(3); Suggest searchSuggest = searchSuggest("ice tea", "did_you_mean", phraseSuggestion); assertSuggestion(searchSuggest, 0, 0, "did_you_mean", "iced tea"); - phraseSuggestion.field("nosuchField"); + phraseSuggestion = phraseSuggestion("nosuchField") + .addCandidateGenerator(candidateGenerator("name").prefixLength(0).minWordLength(0).suggestMode("always").maxEdits(2)) + .gramSize(3); { SearchRequestBuilder searchBuilder = client().prepareSearch().setSize(0); searchBuilder.suggest(new SuggestBuilder().setGlobalText("tetsting sugestion").addSuggestion("did_you_mean", phraseSuggestion)); @@ -330,10 +327,9 @@ public class SuggestSearchTests extends ESIntegTestCase { SearchResponse search = client().prepareSearch().setQuery(matchQuery("text", "spellcecker")).get(); assertThat("didn't ask for suggestions but got some", search.getSuggest(), nullValue()); - TermSuggestionBuilder termSuggest = termSuggestion() + TermSuggestionBuilder termSuggest = termSuggestion("text") .suggestMode(SuggestMode.ALWAYS) // Always, otherwise the results can vary between requests. - .text("abcd") - .field("text"); + .text("abcd"); Suggest suggest = searchSuggest("test", termSuggest); assertSuggestion(suggest, 0, "test", "aacd", "abbd", "abcc"); assertThat(suggest.getSuggestion("test").getEntries().get(0).getText().string(), equalTo("abcd")); @@ -350,10 +346,9 @@ public class SuggestSearchTests extends ESIntegTestCase { index("test", "type1", "1", "foo", "bar"); refresh(); - TermSuggestionBuilder termSuggest = termSuggestion() + TermSuggestionBuilder termSuggest = termSuggestion("text") .suggestMode(SuggestMode.ALWAYS) // Always, otherwise the results can vary between requests. - .text("abcd") - .field("text"); + .text("abcd"); Suggest suggest = searchSuggest("test", termSuggest); assertSuggestionSize(suggest, 0, 0, "test"); assertThat(suggest.getSuggestion("test").getEntries().get(0).getText().string(), equalTo("abcd")); @@ -374,14 +369,14 @@ public class SuggestSearchTests extends ESIntegTestCase { refresh(); Map> suggestions = new HashMap<>(); - suggestions.put("size1", termSuggestion() + suggestions.put("size1", termSuggestion("field1") .size(1).text("prefix_abcd").maxTermFreq(10).prefixLength(1).minDocFreq(0) - .field("field1").suggestMode(SuggestMode.ALWAYS)); - suggestions.put("field2", termSuggestion() - .field("field2").text("prefix_eeeh prefix_efgh") + .suggestMode(SuggestMode.ALWAYS)); + suggestions.put("field2", termSuggestion("field2") + .text("prefix_eeeh prefix_efgh") .maxTermFreq(10).minDocFreq(0).suggestMode(SuggestMode.ALWAYS)); - suggestions.put("accuracy", termSuggestion() - .field("field2").text("prefix_efgh").accuracy(1f) + suggestions.put("accuracy", termSuggestion("field2") + .text("prefix_efgh").accuracy(1f) .maxTermFreq(10).minDocFreq(0).suggestMode(SuggestMode.ALWAYS)); Suggest suggest = searchSuggest(null, 0, suggestions); assertSuggestion(suggest, 0, "size1", "prefix_aacd"); @@ -418,16 +413,16 @@ public class SuggestSearchTests extends ESIntegTestCase { refresh(); Map> suggestions = new HashMap<>(); - suggestions.put("size3SortScoreFirst", termSuggestion() - .size(3).minDocFreq(0).field("field1").suggestMode(SuggestMode.ALWAYS)); - suggestions.put("size10SortScoreFirst", termSuggestion() - .size(10).minDocFreq(0).field("field1").suggestMode(SuggestMode.ALWAYS).shardSize(50)); - suggestions.put("size3SortScoreFirstMaxEdits1", termSuggestion() + suggestions.put("size3SortScoreFirst", termSuggestion("field1") + .size(3).minDocFreq(0).suggestMode(SuggestMode.ALWAYS)); + suggestions.put("size10SortScoreFirst", termSuggestion("field1") + .size(10).minDocFreq(0).suggestMode(SuggestMode.ALWAYS).shardSize(50)); + suggestions.put("size3SortScoreFirstMaxEdits1", termSuggestion("field1") .maxEdits(1) - .size(10).minDocFreq(0).field("field1").suggestMode(SuggestMode.ALWAYS)); - suggestions.put("size10SortFrequencyFirst", termSuggestion() + .size(10).minDocFreq(0).suggestMode(SuggestMode.ALWAYS)); + suggestions.put("size10SortFrequencyFirst", termSuggestion("field1") .size(10).sort(SortBy.FREQUENCY).shardSize(1000) - .minDocFreq(0).field("field1").suggestMode(SuggestMode.ALWAYS)); + .minDocFreq(0).suggestMode(SuggestMode.ALWAYS)); Suggest suggest = searchSuggest("prefix_abcd", 0, suggestions); // The commented out assertions fail sometimes because suggestions are based off of shard frequencies instead of index frequencies. @@ -453,7 +448,7 @@ public class SuggestSearchTests extends ESIntegTestCase { refresh(); Suggest searchSuggest = searchSuggest( "a an the", "simple_phrase", - phraseSuggestion().field("body").gramSize(1) + phraseSuggestion("body").gramSize(1) .addCandidateGenerator(candidateGenerator("body").minWordLength(1).suggestMode("always")) .size(1)); assertSuggestionSize(searchSuggest, 0, 0, "simple_phrase"); @@ -489,13 +484,13 @@ public class SuggestSearchTests extends ESIntegTestCase { refresh(); Suggest searchSuggest = searchSuggest( "hello word", "simple_phrase", - phraseSuggestion().field("body") + phraseSuggestion("body") .addCandidateGenerator(candidateGenerator("body").prefixLength(4).minWordLength(1).suggestMode("always")) .size(1).confidence(1.0f)); assertSuggestion(searchSuggest, 0, "simple_phrase", "hello words"); searchSuggest = searchSuggest( "hello word", "simple_phrase", - phraseSuggestion().field("body") + phraseSuggestion("body") .addCandidateGenerator(candidateGenerator("body").prefixLength(2).minWordLength(1).suggestMode("always")) .size(1).confidence(1.0f)); assertSuggestion(searchSuggest, 0, "simple_phrase", "hello world"); @@ -543,8 +538,7 @@ public class SuggestSearchTests extends ESIntegTestCase { } refresh(); - PhraseSuggestionBuilder phraseSuggest = phraseSuggestion() - .field("bigram").gramSize(2).analyzer("body") + PhraseSuggestionBuilder phraseSuggest = phraseSuggestion("bigram").gramSize(2).analyzer("body") .addCandidateGenerator(candidateGenerator("body").minWordLength(1).suggestMode("always")) .size(1); Suggest searchSuggest = searchSuggest( "american ame", "simple_phrase", phraseSuggest); @@ -680,9 +674,8 @@ public class SuggestSearchTests extends ESIntegTestCase { index("test", "type1", "2", "body", line, "body_reverse", line, "bigram", line); refresh(); - PhraseSuggestionBuilder phraseSuggestion = phraseSuggestion() + PhraseSuggestionBuilder phraseSuggestion = phraseSuggestion("bigram") .realWordErrorLikelihood(0.95f) - .field("bigram") .gramSize(2) .analyzer("body") .addCandidateGenerator(candidateGenerator("body").minWordLength(1).prefixLength(1).suggestMode("always").size(1).accuracy(0.1f)) @@ -740,8 +733,7 @@ public class SuggestSearchTests extends ESIntegTestCase { NumShards numShards = getNumShards("test"); // Lets make sure some things throw exceptions - PhraseSuggestionBuilder phraseSuggestion = phraseSuggestion() - .field("bigram") + PhraseSuggestionBuilder phraseSuggestion = phraseSuggestion("bigram") .analyzer("body") .addCandidateGenerator(candidateGenerator("does_not_exist").minWordLength(1).suggestMode("always")) .realWordErrorLikelihood(0.95f) @@ -773,10 +765,15 @@ public class SuggestSearchTests extends ESIntegTestCase { searchSuggest( "Xor the Got-Jewel", 0, suggestion); // Field doesn't produce unigrams but the analyzer does - phraseSuggestion.forceUnigrams(true).field("bigram").analyzer("ngram"); + phraseSuggestion.forceUnigrams(true).analyzer("ngram"); searchSuggest( "Xor the Got-Jewel", 0, suggestion); - phraseSuggestion.field("ngram").analyzer("myDefAnalyzer") + phraseSuggestion = phraseSuggestion("ngram") + .analyzer("myDefAnalyzer") + .forceUnigrams(true) + .realWordErrorLikelihood(0.95f) + .maxErrors(0.5f) + .size(1) .addCandidateGenerator(candidateGenerator("body").minWordLength(1).suggestMode("always")); Suggest suggest = searchSuggest( "Xor the Got-Jewel", 0, suggestion); @@ -801,8 +798,8 @@ public class SuggestSearchTests extends ESIntegTestCase { client().prepareIndex("test", "type1", "3").setSource("field1", "foobar3").setRouting("3")); Suggest suggest = searchSuggest( "foobar", "simple", - termSuggestion() - .size(10).minDocFreq(0).field("field1").suggestMode(SuggestMode.ALWAYS)); + termSuggestion("field1") + .size(10).minDocFreq(0).suggestMode(SuggestMode.ALWAYS)); ElasticsearchAssertions.assertSuggestionSize(suggest, 0, 3, "simple"); } @@ -842,14 +839,14 @@ public class SuggestSearchTests extends ESIntegTestCase { SearchRequestBuilder request = client().prepareSearch().setSize(0) .suggest( new SuggestBuilder().setGlobalText("tetsting sugestion").addSuggestion("did_you_mean", - phraseSuggestion().field("fielddoesnotexist").maxErrors(5.0f))); + phraseSuggestion("fielddoesnotexist").maxErrors(5.0f))); assertThrows(request, SearchPhaseExecutionException.class); // When searching on a shard which does not hold yet any document of an existing type, we should not fail SearchResponse searchResponse = client().prepareSearch().setSize(0) .suggest( new SuggestBuilder().setGlobalText("tetsting sugestion").addSuggestion("did_you_mean", - phraseSuggestion().field("name").maxErrors(5.0f))) + phraseSuggestion("name").maxErrors(5.0f))) .get(); ElasticsearchAssertions.assertNoFailures(searchResponse); ElasticsearchAssertions.assertSuggestion(searchResponse.getSuggest(), 0, 0, "did_you_mean", "testing suggestions"); @@ -888,7 +885,7 @@ public class SuggestSearchTests extends ESIntegTestCase { .setSize(0) .suggest( new SuggestBuilder().setGlobalText("tetsting sugestion").addSuggestion("did_you_mean", - phraseSuggestion().field("name").maxErrors(5.0f))) + phraseSuggestion("name").maxErrors(5.0f))) .get(); assertNoFailures(searchResponse); @@ -945,16 +942,14 @@ public class SuggestSearchTests extends ESIntegTestCase { } refresh(); - Suggest searchSuggest = searchSuggest("nobel prize", "simple_phrase", phraseSuggestion() - .field("body") + Suggest searchSuggest = searchSuggest("nobel prize", "simple_phrase", phraseSuggestion("body") .addCandidateGenerator(candidateGenerator("body").minWordLength(1).suggestMode("always").maxTermFreq(.99f)) .confidence(2f) .maxErrors(5f) .size(1)); assertSuggestionSize(searchSuggest, 0, 0, "simple_phrase"); - searchSuggest = searchSuggest("noble prize", "simple_phrase", phraseSuggestion() - .field("body") + searchSuggest = searchSuggest("noble prize", "simple_phrase", phraseSuggestion("body") .addCandidateGenerator(candidateGenerator("body").minWordLength(1).suggestMode("always").maxTermFreq(.99f)) .confidence(2f) .maxErrors(5f) @@ -1084,8 +1079,7 @@ public class SuggestSearchTests extends ESIntegTestCase { } indexRandom(true, builders); - PhraseSuggestionBuilder suggest = phraseSuggestion() - .field("title") + PhraseSuggestionBuilder suggest = phraseSuggestion("title") .addCandidateGenerator(candidateGenerator("title") .suggestMode("always") .maxTermFreq(.99f) @@ -1149,8 +1143,7 @@ public class SuggestSearchTests extends ESIntegTestCase { indexRandom(true, builders); // suggest without collate - PhraseSuggestionBuilder suggest = phraseSuggestion() - .field("title") + PhraseSuggestionBuilder suggest = phraseSuggestion("title") .addCandidateGenerator(candidateGenerator("title") .suggestMode("always") .maxTermFreq(.99f)