Suggest: Move name of suggestion to SuggestBuilder
Currently each suggestion keeps track of its own name. This has the disadvantage of having to pass down the parsed name property in the suggestions fromXContent() and the serialization methods as an argument, since we need it in the ctor. This change moves the naming of the suggestions to the surrounding SuggestBuilder and by this eliminates the need for passind down the names in the parsing and serialization methods. By making `name` a required argument in SuggestBuilder#addSuggestion() we also make sure it is always set and prevent using the same name twice, which wasn't possible before.
This commit is contained in:
parent
aecf51cb42
commit
be8ed737bc
|
@ -393,9 +393,7 @@ public class SearchRequestBuilder extends ActionRequestBuilder<SearchRequest, Se
|
|||
}
|
||||
|
||||
/**
|
||||
* Delegates to
|
||||
* {@link org.elasticsearch.search.suggest.SuggestBuilder#addSuggestion(org.elasticsearch.search.suggest.SuggestBuilder.SuggestionBuilder)}
|
||||
* .
|
||||
* Delegates to {@link SearchSourceBuilder#suggest(SuggestBuilder)}
|
||||
*/
|
||||
public SearchRequestBuilder suggest(SuggestBuilder suggestBuilder) {
|
||||
sourceBuilder().suggest(suggestBuilder);
|
||||
|
|
|
@ -44,9 +44,11 @@ public class SuggestRequestBuilder extends BroadcastOperationRequestBuilder<Sugg
|
|||
|
||||
/**
|
||||
* Add a definition for suggestions to the request
|
||||
* @param name the name for the suggestion that will also be used in the response
|
||||
* @param suggestion the suggestion configuration
|
||||
*/
|
||||
public SuggestRequestBuilder addSuggestion(SuggestionBuilder<?> suggestion) {
|
||||
suggest.addSuggestion(suggestion);
|
||||
public SuggestRequestBuilder addSuggestion(String name, SuggestionBuilder<?> suggestion) {
|
||||
suggest.addSuggestion(name, suggestion);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
|
|
@ -48,6 +48,7 @@ import org.elasticsearch.search.fetch.source.FetchSourceContext;
|
|||
import org.elasticsearch.search.internal.SearchContext;
|
||||
import org.elasticsearch.search.sort.SortOrder;
|
||||
import org.elasticsearch.search.suggest.SuggestBuilder;
|
||||
import org.elasticsearch.search.suggest.term.TermSuggestionBuilder.SuggestMode;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
|
@ -56,7 +57,6 @@ import static org.elasticsearch.common.unit.TimeValue.parseTimeValue;
|
|||
import static org.elasticsearch.rest.RestRequest.Method.GET;
|
||||
import static org.elasticsearch.rest.RestRequest.Method.POST;
|
||||
import static org.elasticsearch.search.suggest.SuggestBuilders.termSuggestion;
|
||||
import static org.elasticsearch.search.suggest.term.TermSuggestionBuilder.SuggestMode;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -255,8 +255,8 @@ public class RestSearchAction extends BaseRestHandler {
|
|||
String suggestText = request.param("suggest_text", request.param("q"));
|
||||
int suggestSize = request.paramAsInt("suggest_size", 5);
|
||||
String suggestMode = request.param("suggest_mode");
|
||||
searchSourceBuilder.suggest(new SuggestBuilder().addSuggestion(
|
||||
termSuggestion(suggestField).field(suggestField)
|
||||
searchSourceBuilder.suggest(new SuggestBuilder().addSuggestion(suggestField,
|
||||
termSuggestion().field(suggestField)
|
||||
.text(suggestText).size(suggestSize)
|
||||
.suggestMode(SuggestMode.resolve(suggestMode))));
|
||||
}
|
||||
|
|
|
@ -34,8 +34,9 @@ import org.elasticsearch.index.query.QueryShardContext;
|
|||
import org.elasticsearch.search.suggest.SuggestionSearchContext.SuggestionContext;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
|
@ -51,10 +52,7 @@ public class SuggestBuilder extends ToXContentToBytes implements Writeable<Sugge
|
|||
protected static final ParseField GLOBAL_TEXT_FIELD = new ParseField("text");
|
||||
|
||||
private String globalText;
|
||||
private final List<SuggestionBuilder<?>> suggestions = new ArrayList<>();
|
||||
|
||||
public SuggestBuilder() {
|
||||
}
|
||||
private final Map<String, SuggestionBuilder<?>> suggestions = new HashMap<>();
|
||||
|
||||
/**
|
||||
* Sets the text to provide suggestions for. The suggest text is a required option that needs
|
||||
|
@ -79,23 +77,23 @@ public class SuggestBuilder extends ToXContentToBytes implements Writeable<Sugge
|
|||
/**
|
||||
* Adds an {@link org.elasticsearch.search.suggest.SuggestionBuilder} instance under a user defined name.
|
||||
* The order in which the <code>Suggestions</code> are added, is the same as in the response.
|
||||
* @throws IllegalArgumentException if two suggestions added have the same name
|
||||
*/
|
||||
public SuggestBuilder addSuggestion(SuggestionBuilder<?> suggestion) {
|
||||
suggestions.add(suggestion);
|
||||
public SuggestBuilder addSuggestion(String name, SuggestionBuilder<?> suggestion) {
|
||||
Objects.requireNonNull(name, "every suggestion needs a name");
|
||||
if (suggestions.get(name) == null) {
|
||||
suggestions.put(name, suggestion);
|
||||
} else {
|
||||
throw new IllegalArgumentException("already added another suggestion with name [" + name + "]");
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the <code>Suggestions</code> that were added to the globat {@link SuggestBuilder}
|
||||
* Get all the <code>Suggestions</code> that were added to the global {@link SuggestBuilder},
|
||||
* together with their names
|
||||
*/
|
||||
public List<SuggestionBuilder<?>> getSuggestions() {
|
||||
return suggestions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all suggestions with the defined names.
|
||||
*/
|
||||
public List<SuggestionBuilder<?>> getSuggestion() {
|
||||
public Map<String, SuggestionBuilder<?>> getSuggestions() {
|
||||
return suggestions;
|
||||
}
|
||||
|
||||
|
@ -105,8 +103,10 @@ public class SuggestBuilder extends ToXContentToBytes implements Writeable<Sugge
|
|||
if (globalText != null) {
|
||||
builder.field("text", globalText);
|
||||
}
|
||||
for (SuggestionBuilder<?> suggestion : suggestions) {
|
||||
builder = suggestion.toXContent(builder, params);
|
||||
for (Entry<String, SuggestionBuilder<?>> suggestion : suggestions.entrySet()) {
|
||||
builder.startObject(suggestion.getKey());
|
||||
suggestion.getValue().toXContent(builder, params);
|
||||
builder.endObject();
|
||||
}
|
||||
builder.endObject();
|
||||
return builder;
|
||||
|
@ -133,7 +133,7 @@ public class SuggestBuilder extends ToXContentToBytes implements Writeable<Sugge
|
|||
if (suggestionName == null) {
|
||||
throw new IllegalArgumentException("Suggestion must have name");
|
||||
}
|
||||
suggestBuilder.addSuggestion(SuggestionBuilder.fromXContent(parseContext, suggestionName, suggesters));
|
||||
suggestBuilder.addSuggestion(suggestionName, SuggestionBuilder.fromXContent(parseContext, suggesters));
|
||||
} else {
|
||||
throw new ParsingException(parser.getTokenLocation(), "unexpected token [" + token + "] after [" + fieldName + "]");
|
||||
}
|
||||
|
@ -143,15 +143,15 @@ public class SuggestBuilder extends ToXContentToBytes implements Writeable<Sugge
|
|||
|
||||
public SuggestionSearchContext build(QueryShardContext context) throws IOException {
|
||||
SuggestionSearchContext suggestionSearchContext = new SuggestionSearchContext();
|
||||
for (SuggestionBuilder<?> suggestionBuilder : suggestions) {
|
||||
SuggestionContext suggestionContext = suggestionBuilder.build(context);
|
||||
for (Entry<String, SuggestionBuilder<?>> suggestion : suggestions.entrySet()) {
|
||||
SuggestionContext suggestionContext = suggestion.getValue().build(context);
|
||||
if (suggestionContext.getText() == null) {
|
||||
if (globalText == null) {
|
||||
throw new IllegalArgumentException("The required text option is missing");
|
||||
}
|
||||
suggestionContext.setText(BytesRefs.toBytesRef(globalText));
|
||||
}
|
||||
suggestionSearchContext.addSuggestion(suggestionBuilder.name(), suggestionContext);
|
||||
suggestionSearchContext.addSuggestion(suggestion.getKey(), suggestionContext);
|
||||
}
|
||||
return suggestionSearchContext;
|
||||
}
|
||||
|
@ -162,7 +162,7 @@ public class SuggestBuilder extends ToXContentToBytes implements Writeable<Sugge
|
|||
builder.globalText = in.readOptionalString();
|
||||
final int size = in.readVInt();
|
||||
for (int i = 0; i < size; i++) {
|
||||
builder.suggestions.add(in.readSuggestion());
|
||||
builder.suggestions.put(in.readString(), in.readSuggestion());
|
||||
}
|
||||
return builder;
|
||||
}
|
||||
|
@ -172,8 +172,9 @@ public class SuggestBuilder extends ToXContentToBytes implements Writeable<Sugge
|
|||
out.writeOptionalString(globalText);
|
||||
final int size = suggestions.size();
|
||||
out.writeVInt(size);
|
||||
for (int i = 0; i < size; i++) {
|
||||
out.writeSuggestion(suggestions.get(i));
|
||||
for (Entry<String, SuggestionBuilder<?>> suggestion : suggestions.entrySet()) {
|
||||
out.writeString(suggestion.getKey());
|
||||
out.writeSuggestion(suggestion.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -31,33 +31,30 @@ public abstract class SuggestBuilders {
|
|||
/**
|
||||
* Creates a term suggestion lookup query with the provided <code>name</code>
|
||||
*
|
||||
* @param name The suggestion name
|
||||
* @return a {@link org.elasticsearch.search.suggest.term.TermSuggestionBuilder}
|
||||
* instance
|
||||
*/
|
||||
public static TermSuggestionBuilder termSuggestion(String name) {
|
||||
return new TermSuggestionBuilder(name);
|
||||
public static TermSuggestionBuilder termSuggestion() {
|
||||
return new TermSuggestionBuilder();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a phrase suggestion lookup query with the provided <code>name</code>
|
||||
*
|
||||
* @param name The suggestion name
|
||||
* @return a {@link org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder}
|
||||
* instance
|
||||
*/
|
||||
public static PhraseSuggestionBuilder phraseSuggestion(String name) {
|
||||
return new PhraseSuggestionBuilder(name);
|
||||
public static PhraseSuggestionBuilder phraseSuggestion() {
|
||||
return new PhraseSuggestionBuilder();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a completion suggestion lookup query with the provided <code>name</code>
|
||||
*
|
||||
* @param name The suggestion name
|
||||
* @return a {@link org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder}
|
||||
* instance
|
||||
*/
|
||||
public static CompletionSuggestionBuilder completionSuggestion(String name) {
|
||||
return new CompletionSuggestionBuilder(name);
|
||||
public static CompletionSuggestionBuilder completionSuggestion() {
|
||||
return new CompletionSuggestionBuilder();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,7 +43,6 @@ import java.util.Objects;
|
|||
*/
|
||||
public abstract class SuggestionBuilder<T extends SuggestionBuilder<T>> extends ToXContentToBytes implements NamedWriteable<T> {
|
||||
|
||||
protected final String name;
|
||||
// TODO this seems mandatory and should be constructor arg
|
||||
protected String fieldname;
|
||||
protected String text;
|
||||
|
@ -61,18 +60,6 @@ public abstract class SuggestionBuilder<T extends SuggestionBuilder<T>> extends
|
|||
protected static final ParseField SIZE_FIELD = new ParseField("size");
|
||||
protected static final ParseField SHARDSIZE_FIELD = new ParseField("shard_size");
|
||||
|
||||
public SuggestionBuilder(String name) {
|
||||
Objects.requireNonNull(name, "Suggester 'name' cannot be null");
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* get the name for this suggestion
|
||||
*/
|
||||
public String name() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Same as in {@link SuggestBuilder#setGlobalText(String)}, but in the suggestion scope.
|
||||
*/
|
||||
|
@ -117,7 +104,6 @@ public abstract class SuggestionBuilder<T extends SuggestionBuilder<T>> extends
|
|||
|
||||
@Override
|
||||
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
||||
builder.startObject(name);
|
||||
if (text != null) {
|
||||
builder.field(TEXT_FIELD.getPreferredName(), text);
|
||||
}
|
||||
|
@ -143,13 +129,12 @@ public abstract class SuggestionBuilder<T extends SuggestionBuilder<T>> extends
|
|||
|
||||
builder = innerToXContent(builder, params);
|
||||
builder.endObject();
|
||||
builder.endObject();
|
||||
return builder;
|
||||
}
|
||||
|
||||
protected abstract XContentBuilder innerToXContent(XContentBuilder builder, Params params) throws IOException;
|
||||
|
||||
public static SuggestionBuilder<?> fromXContent(QueryParseContext parseContext, String suggestionName, Suggesters suggesters)
|
||||
public static SuggestionBuilder<?> fromXContent(QueryParseContext parseContext, Suggesters suggesters)
|
||||
throws IOException {
|
||||
XContentParser parser = parseContext.parser();
|
||||
ParseFieldMatcher parsefieldMatcher = parseContext.parseFieldMatcher();
|
||||
|
@ -174,14 +159,11 @@ public abstract class SuggestionBuilder<T extends SuggestionBuilder<T>> extends
|
|||
throw new IllegalArgumentException("[suggestion] does not support [" + fieldName + "]");
|
||||
}
|
||||
} else if (token == XContentParser.Token.START_OBJECT) {
|
||||
if (suggestionName == null) {
|
||||
throw new IllegalArgumentException("Suggestion must have name");
|
||||
}
|
||||
SuggestionBuilder<?> suggestParser = suggesters.getSuggestionPrototype(fieldName);
|
||||
if (suggestParser == null) {
|
||||
throw new IllegalArgumentException("Suggester[" + fieldName + "] not supported");
|
||||
}
|
||||
suggestionBuilder = suggestParser.innerFromXContent(parseContext, suggestionName);
|
||||
suggestionBuilder = suggestParser.innerFromXContent(parseContext);
|
||||
}
|
||||
}
|
||||
if (suggestText != null) {
|
||||
|
@ -196,7 +178,7 @@ public abstract class SuggestionBuilder<T extends SuggestionBuilder<T>> extends
|
|||
return suggestionBuilder;
|
||||
}
|
||||
|
||||
protected abstract SuggestionBuilder<T> innerFromXContent(QueryParseContext parseContext, String name) throws IOException;
|
||||
protected abstract SuggestionBuilder<T> innerFromXContent(QueryParseContext parseContext) throws IOException;
|
||||
|
||||
public SuggestionContext build(QueryShardContext context) throws IOException {
|
||||
SuggestionContext suggestionContext = innerBuild(context);
|
||||
|
@ -357,8 +339,7 @@ public abstract class SuggestionBuilder<T extends SuggestionBuilder<T>> extends
|
|||
|
||||
@Override
|
||||
public final T readFrom(StreamInput in) throws IOException {
|
||||
String name = in.readString();
|
||||
T suggestionBuilder = doReadFrom(in, name);
|
||||
T suggestionBuilder = doReadFrom(in);
|
||||
suggestionBuilder.fieldname = in.readOptionalString();
|
||||
suggestionBuilder.text = in.readOptionalString();
|
||||
suggestionBuilder.prefix = in.readOptionalString();
|
||||
|
@ -372,13 +353,11 @@ public abstract class SuggestionBuilder<T extends SuggestionBuilder<T>> extends
|
|||
/**
|
||||
* Subclass should return a new instance, reading itself from the input string
|
||||
* @param in the input string to read from
|
||||
* @param name the name of the suggestion (read from stream by {@link SuggestionBuilder}
|
||||
*/
|
||||
protected abstract T doReadFrom(StreamInput in, String name) throws IOException;
|
||||
protected abstract T doReadFrom(StreamInput in) throws IOException;
|
||||
|
||||
@Override
|
||||
public final void writeTo(StreamOutput out) throws IOException {
|
||||
out.writeString(name);
|
||||
doWriteTo(out);
|
||||
out.writeOptionalString(fieldname);
|
||||
out.writeOptionalString(text);
|
||||
|
@ -401,8 +380,7 @@ public abstract class SuggestionBuilder<T extends SuggestionBuilder<T>> extends
|
|||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
T other = (T) obj;
|
||||
return Objects.equals(name, other.name()) &&
|
||||
Objects.equals(text, other.text()) &&
|
||||
return Objects.equals(text, other.text()) &&
|
||||
Objects.equals(prefix, other.prefix()) &&
|
||||
Objects.equals(regex, other.regex()) &&
|
||||
Objects.equals(fieldname, other.field()) &&
|
||||
|
@ -419,7 +397,7 @@ public abstract class SuggestionBuilder<T extends SuggestionBuilder<T>> extends
|
|||
|
||||
@Override
|
||||
public final int hashCode() {
|
||||
return Objects.hash(name, text, prefix, regex, fieldname, analyzer, size, shardSize, doHashCode());
|
||||
return Objects.hash(text, prefix, regex, fieldname, analyzer, size, shardSize, doHashCode());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -50,7 +50,7 @@ import java.util.Set;
|
|||
*/
|
||||
public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSuggestionBuilder> {
|
||||
|
||||
public static final CompletionSuggestionBuilder PROTOTYPE = new CompletionSuggestionBuilder("_na_"); // name doesn't matter
|
||||
public static final CompletionSuggestionBuilder PROTOTYPE = new CompletionSuggestionBuilder();
|
||||
static final String SUGGESTION_NAME = "completion";
|
||||
static final ParseField PAYLOAD_FIELD = new ParseField("payload");
|
||||
static final ParseField CONTEXTS_FIELD = new ParseField("contexts", "context");
|
||||
|
@ -60,10 +60,6 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug
|
|||
private final Map<String, List<QueryContext>> queryContexts = new HashMap<>();
|
||||
private final Set<String> payloadFields = new HashSet<>();
|
||||
|
||||
public CompletionSuggestionBuilder(String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the prefix to provide completions for.
|
||||
* The prefix gets analyzed by the suggest analyzer.
|
||||
|
@ -179,7 +175,7 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug
|
|||
}
|
||||
|
||||
@Override
|
||||
protected CompletionSuggestionBuilder innerFromXContent(QueryParseContext parseContext, String name) throws IOException {
|
||||
protected CompletionSuggestionBuilder innerFromXContent(QueryParseContext parseContext) throws IOException {
|
||||
// NORELEASE implement parsing logic
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
@ -233,8 +229,8 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletionSuggestionBuilder doReadFrom(StreamInput in, String name) throws IOException {
|
||||
CompletionSuggestionBuilder completionSuggestionBuilder = new CompletionSuggestionBuilder(name);
|
||||
public CompletionSuggestionBuilder doReadFrom(StreamInput in) throws IOException {
|
||||
CompletionSuggestionBuilder completionSuggestionBuilder = new CompletionSuggestionBuilder();
|
||||
if (in.readBoolean()) {
|
||||
int numPayloadField = in.readVInt();
|
||||
for (int i = 0; i < numPayloadField; i++) {
|
||||
|
|
|
@ -30,7 +30,6 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
|
|||
import org.elasticsearch.common.xcontent.XContentParser;
|
||||
import org.elasticsearch.common.xcontent.XContentParser.Token;
|
||||
import org.elasticsearch.index.analysis.ShingleTokenFilterFactory;
|
||||
import org.elasticsearch.index.mapper.MappedFieldType;
|
||||
import org.elasticsearch.index.mapper.MapperService;
|
||||
import org.elasticsearch.index.query.QueryParseContext;
|
||||
import org.elasticsearch.index.query.QueryShardContext;
|
||||
|
@ -59,7 +58,7 @@ public final class PhraseSuggestionBuilder extends SuggestionBuilder<PhraseSugge
|
|||
|
||||
private static final String SUGGESTION_NAME = "phrase";
|
||||
|
||||
public static final PhraseSuggestionBuilder PROTOTYPE = new PhraseSuggestionBuilder("_na_");
|
||||
public static final PhraseSuggestionBuilder PROTOTYPE = new PhraseSuggestionBuilder();
|
||||
|
||||
protected static final ParseField MAXERRORS_FIELD = new ParseField("max_errors");
|
||||
protected static final ParseField RWE_LIKELIHOOD_FIELD = new ParseField("real_word_error_likelihood");
|
||||
|
@ -94,10 +93,6 @@ public final class PhraseSuggestionBuilder extends SuggestionBuilder<PhraseSugge
|
|||
private SmoothingModel model;
|
||||
private final Map<String, List<CandidateGenerator>> generators = new HashMap<>();
|
||||
|
||||
public PhraseSuggestionBuilder(String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the gram size for the n-gram model used for this suggester. The
|
||||
* default value is <tt>1</tt> corresponding to <tt>unigrams</tt>. Use
|
||||
|
@ -398,9 +393,9 @@ public final class PhraseSuggestionBuilder extends SuggestionBuilder<PhraseSugge
|
|||
}
|
||||
|
||||
@Override
|
||||
protected PhraseSuggestionBuilder innerFromXContent(QueryParseContext parseContext, String suggestionName) throws IOException {
|
||||
protected PhraseSuggestionBuilder innerFromXContent(QueryParseContext parseContext) throws IOException {
|
||||
XContentParser parser = parseContext.parser();
|
||||
PhraseSuggestionBuilder suggestion = new PhraseSuggestionBuilder(suggestionName);
|
||||
PhraseSuggestionBuilder suggestion = new PhraseSuggestionBuilder();
|
||||
ParseFieldMatcher parseFieldMatcher = parseContext.parseFieldMatcher();
|
||||
XContentParser.Token token;
|
||||
String fieldName = null;
|
||||
|
@ -621,8 +616,8 @@ public final class PhraseSuggestionBuilder extends SuggestionBuilder<PhraseSugge
|
|||
}
|
||||
|
||||
@Override
|
||||
public PhraseSuggestionBuilder doReadFrom(StreamInput in, String name) throws IOException {
|
||||
PhraseSuggestionBuilder builder = new PhraseSuggestionBuilder(name);
|
||||
public PhraseSuggestionBuilder doReadFrom(StreamInput in) throws IOException {
|
||||
PhraseSuggestionBuilder builder = new PhraseSuggestionBuilder();
|
||||
builder.maxErrors = in.readFloat();
|
||||
builder.realWordErrorLikelihood = in.readFloat();
|
||||
builder.confidence = in.readFloat();
|
||||
|
|
|
@ -67,7 +67,7 @@ import static org.elasticsearch.search.suggest.SuggestUtils.Fields.SUGGEST_MODE;
|
|||
*/
|
||||
public class TermSuggestionBuilder extends SuggestionBuilder<TermSuggestionBuilder> {
|
||||
|
||||
public static final TermSuggestionBuilder PROTOTYPE = new TermSuggestionBuilder("_na_"); // name doesn't matter
|
||||
public static final TermSuggestionBuilder PROTOTYPE = new TermSuggestionBuilder();
|
||||
private static final String SUGGESTION_NAME = "term";
|
||||
|
||||
private SuggestMode suggestMode = SuggestMode.MISSING;
|
||||
|
@ -81,14 +81,6 @@ public class TermSuggestionBuilder extends SuggestionBuilder<TermSuggestionBuild
|
|||
private Integer minWordLength = DEFAULT_MIN_WORD_LENGTH;
|
||||
private Float minDocFreq = DEFAULT_MIN_DOC_FREQ;
|
||||
|
||||
/**
|
||||
* @param name
|
||||
* The name of this suggestion. This is a required parameter.
|
||||
*/
|
||||
public TermSuggestionBuilder(String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* The global suggest mode controls what suggested terms are included or
|
||||
* controls for what suggest text tokens, terms should be suggested for.
|
||||
|
@ -345,9 +337,9 @@ public class TermSuggestionBuilder extends SuggestionBuilder<TermSuggestionBuild
|
|||
}
|
||||
|
||||
@Override
|
||||
protected TermSuggestionBuilder innerFromXContent(QueryParseContext parseContext, String name) throws IOException {
|
||||
protected TermSuggestionBuilder innerFromXContent(QueryParseContext parseContext) throws IOException {
|
||||
XContentParser parser = parseContext.parser();
|
||||
TermSuggestionBuilder suggestion = new TermSuggestionBuilder(name);
|
||||
TermSuggestionBuilder suggestion = new TermSuggestionBuilder();
|
||||
ParseFieldMatcher parseFieldMatcher = parseContext.parseFieldMatcher();
|
||||
XContentParser.Token token;
|
||||
String fieldName = null;
|
||||
|
@ -431,8 +423,8 @@ public class TermSuggestionBuilder extends SuggestionBuilder<TermSuggestionBuild
|
|||
}
|
||||
|
||||
@Override
|
||||
public TermSuggestionBuilder doReadFrom(StreamInput in, String name) throws IOException {
|
||||
TermSuggestionBuilder builder = new TermSuggestionBuilder(name);
|
||||
public TermSuggestionBuilder doReadFrom(StreamInput in) throws IOException {
|
||||
TermSuggestionBuilder builder = new TermSuggestionBuilder();
|
||||
builder.suggestMode = SuggestMode.PROTOTYPE.readFrom(in);
|
||||
builder.accuracy = in.readFloat();
|
||||
builder.sort = SortBy.PROTOTYPE.readFrom(in);
|
||||
|
@ -470,18 +462,21 @@ public class TermSuggestionBuilder extends SuggestionBuilder<TermSuggestionBuild
|
|||
public enum SuggestMode implements Writeable<SuggestMode> {
|
||||
/** Only suggest terms in the suggest text that aren't in the index. This is the default. */
|
||||
MISSING {
|
||||
@Override
|
||||
public org.apache.lucene.search.spell.SuggestMode toLucene() {
|
||||
return org.apache.lucene.search.spell.SuggestMode.SUGGEST_WHEN_NOT_IN_INDEX;
|
||||
}
|
||||
},
|
||||
/** Only suggest terms that occur in more docs then the original suggest text term. */
|
||||
POPULAR {
|
||||
@Override
|
||||
public org.apache.lucene.search.spell.SuggestMode toLucene() {
|
||||
return org.apache.lucene.search.spell.SuggestMode.SUGGEST_MORE_POPULAR;
|
||||
}
|
||||
},
|
||||
/** Suggest any matching suggest terms based on tokens in the suggest text. */
|
||||
ALWAYS {
|
||||
@Override
|
||||
public org.apache.lucene.search.spell.SuggestMode toLucene() {
|
||||
return org.apache.lucene.search.spell.SuggestMode.SUGGEST_ALWAYS;
|
||||
}
|
||||
|
@ -516,30 +511,35 @@ public class TermSuggestionBuilder extends SuggestionBuilder<TermSuggestionBuild
|
|||
/** This is the default and is based on <code>damerau_levenshtein</code>, but highly optimized
|
||||
* for comparing string distance for terms inside the index. */
|
||||
INTERNAL {
|
||||
@Override
|
||||
public StringDistance toLucene() {
|
||||
return DirectSpellChecker.INTERNAL_LEVENSHTEIN;
|
||||
}
|
||||
},
|
||||
/** String distance algorithm based on Damerau-Levenshtein algorithm. */
|
||||
DAMERAU_LEVENSHTEIN {
|
||||
@Override
|
||||
public StringDistance toLucene() {
|
||||
return new LuceneLevenshteinDistance();
|
||||
}
|
||||
},
|
||||
/** String distance algorithm based on Levenstein edit distance algorithm. */
|
||||
LEVENSTEIN {
|
||||
@Override
|
||||
public StringDistance toLucene() {
|
||||
return new LevensteinDistance();
|
||||
}
|
||||
},
|
||||
/** String distance algorithm based on Jaro-Winkler algorithm. */
|
||||
JAROWINKLER {
|
||||
@Override
|
||||
public StringDistance toLucene() {
|
||||
return new JaroWinklerDistance();
|
||||
}
|
||||
},
|
||||
/** String distance algorithm based on character n-grams. */
|
||||
NGRAM {
|
||||
@Override
|
||||
public StringDistance toLucene() {
|
||||
return new NGramDistance();
|
||||
}
|
||||
|
|
|
@ -139,9 +139,9 @@ public class SuggestStatsIT extends ESIntegTestCase {
|
|||
private SuggestRequestBuilder addSuggestions(SuggestRequestBuilder request, int i) {
|
||||
for (int s = 0; s < randomIntBetween(2, 10); s++) {
|
||||
if (randomBoolean()) {
|
||||
request.addSuggestion(new PhraseSuggestionBuilder("s" + s).field("f").text("test" + i + " test" + (i - 1)));
|
||||
request.addSuggestion("s" + s, new PhraseSuggestionBuilder().field("f").text("test" + i + " test" + (i - 1)));
|
||||
} else {
|
||||
request.addSuggestion(new TermSuggestionBuilder("s" + s).field("f").text("test" + i));
|
||||
request.addSuggestion("s" + s, new TermSuggestionBuilder().field("f").text("test" + i));
|
||||
}
|
||||
}
|
||||
return request;
|
||||
|
|
|
@ -749,7 +749,7 @@ public class IndicesOptionsIntegrationIT extends ESIntegTestCase {
|
|||
}
|
||||
|
||||
private static SuggestRequestBuilder suggest(String... indices) {
|
||||
return client().prepareSuggest(indices).addSuggestion(SuggestBuilders.termSuggestion("name").field("a"));
|
||||
return client().prepareSuggest(indices).addSuggestion("name", SuggestBuilders.termSuggestion().field("a"));
|
||||
}
|
||||
|
||||
private static GetAliasesRequestBuilder getAliases(String... indices) {
|
||||
|
|
|
@ -49,15 +49,9 @@ import org.elasticsearch.env.Environment;
|
|||
import org.elasticsearch.env.EnvironmentModule;
|
||||
import org.elasticsearch.index.Index;
|
||||
import org.elasticsearch.index.query.AbstractQueryTestCase;
|
||||
import org.elasticsearch.index.query.BoolQueryBuilder;
|
||||
import org.elasticsearch.index.query.EmptyQueryBuilder;
|
||||
import org.elasticsearch.index.query.MatchAllQueryBuilder;
|
||||
import org.elasticsearch.index.query.QueryBuilders;
|
||||
import org.elasticsearch.index.query.QueryParseContext;
|
||||
import org.elasticsearch.index.query.QueryRewriteContext;
|
||||
import org.elasticsearch.index.query.TermQueryBuilder;
|
||||
import org.elasticsearch.index.query.WrapperQueryBuilder;
|
||||
import org.elasticsearch.index.query.functionscore.ScoreFunctionParser;
|
||||
import org.elasticsearch.indices.IndicesModule;
|
||||
import org.elasticsearch.indices.breaker.CircuitBreakerService;
|
||||
import org.elasticsearch.indices.breaker.NoneCircuitBreakerService;
|
||||
|
@ -417,7 +411,8 @@ public class SearchSourceBuilderTests extends ESTestCase {
|
|||
if (randomBoolean()) {
|
||||
// NORELEASE need a random suggest builder method
|
||||
builder.suggest(new SuggestBuilder().setGlobalText(randomAsciiOfLengthBetween(1, 5)).addSuggestion(
|
||||
SuggestBuilders.termSuggestion(randomAsciiOfLengthBetween(1, 5))));
|
||||
randomAsciiOfLengthBetween(1, 5),
|
||||
SuggestBuilders.termSuggestion()));
|
||||
}
|
||||
if (randomBoolean()) {
|
||||
// NORELEASE need a random inner hits builder method
|
||||
|
|
|
@ -204,10 +204,8 @@ public abstract class AbstractSuggestionBuilderTestCase<SB extends SuggestionBui
|
|||
context.reset(parser);
|
||||
// we need to skip the start object and the name, those will be parsed by outer SuggestBuilder
|
||||
parser.nextToken();
|
||||
parser.nextToken();
|
||||
parser.nextToken();
|
||||
|
||||
SuggestionBuilder<?> secondSuggestionBuilder = SuggestionBuilder.fromXContent(context, suggestionBuilder.name(), suggesters);
|
||||
SuggestionBuilder<?> secondSuggestionBuilder = SuggestionBuilder.fromXContent(context, suggesters);
|
||||
assertNotSame(suggestionBuilder, secondSuggestionBuilder);
|
||||
assertEquals(suggestionBuilder, secondSuggestionBuilder);
|
||||
assertEquals(suggestionBuilder.hashCode(), secondSuggestionBuilder.hashCode());
|
||||
|
@ -253,7 +251,7 @@ public abstract class AbstractSuggestionBuilderTestCase<SB extends SuggestionBui
|
|||
for (int runs = 0; runs < NUMBER_OF_TESTBUILDERS; runs++) {
|
||||
SuggestBuilder suggestBuilder = new SuggestBuilder();
|
||||
SB suggestionBuilder = randomTestBuilder();
|
||||
suggestBuilder.addSuggestion(suggestionBuilder);
|
||||
suggestBuilder.addSuggestion(randomAsciiOfLength(10), suggestionBuilder);
|
||||
|
||||
if (suggestionBuilder.text() == null) {
|
||||
// we either need suggestion text or global text
|
||||
|
|
|
@ -105,7 +105,7 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
));
|
||||
}
|
||||
indexRandom(true, indexRequestBuilders);
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg");
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(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("foo").field(FIELD).regex("sugg.*es");
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(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("foo").field(FIELD).prefix("sugg", Fuzziness.ONE);
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(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("foo").field(FIELD).prefix("sug").size(size);
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sug").size(size);
|
||||
assertSuggestions("foo", prefix, outputs);
|
||||
|
||||
CompletionSuggestionBuilder regex = SuggestBuilders.completionSuggestion("foo").field(FIELD).regex("su[g|s]g").size(size);
|
||||
CompletionSuggestionBuilder regex = SuggestBuilders.completionSuggestion().field(FIELD).regex("su[g|s]g").size(size);
|
||||
assertSuggestions("foo", regex, outputs);
|
||||
|
||||
CompletionSuggestionBuilder fuzzyPrefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg", Fuzziness.ONE).size(size);
|
||||
CompletionSuggestionBuilder fuzzyPrefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg", Fuzziness.ONE).size(size);
|
||||
assertSuggestions("foo", fuzzyPrefix, outputs);
|
||||
}
|
||||
|
||||
|
@ -198,9 +198,9 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
}
|
||||
indexRandom(true, indexRequestBuilders);
|
||||
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg").
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg").
|
||||
size(numDocs).payload(Collections.singletonList("count"));
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(prefix).execute().actionGet();
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", prefix).execute().actionGet();
|
||||
assertNoFailures(suggestResponse);
|
||||
CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("foo");
|
||||
CompletionSuggestion.Entry options = completionSuggestion.getEntries().get(0);
|
||||
|
@ -245,9 +245,9 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
client().prepareIndex(INDEX, TYPE, "2").setSource(FIELD, "suggestion")
|
||||
);
|
||||
indexRandom(true, indexRequestBuilders);
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg")
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg")
|
||||
.payload(Collections.singletonList("test_field"));
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(prefix).execute().actionGet();
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", prefix).execute().actionGet();
|
||||
assertNoFailures(suggestResponse);
|
||||
CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("foo");
|
||||
CompletionSuggestion.Entry options = completionSuggestion.getEntries().get(0);
|
||||
|
@ -283,9 +283,9 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
indexRequestBuilders.add(client().prepareIndex(INDEX, TYPE, "2").setSource(source));
|
||||
indexRandom(true, indexRequestBuilders);
|
||||
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg")
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg")
|
||||
.payload(Arrays.asList("title", "count"));
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(prefix).execute().actionGet();
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", prefix).execute().actionGet();
|
||||
assertNoFailures(suggestResponse);
|
||||
CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("foo");
|
||||
List<CompletionSuggestion.Entry.Option> options = completionSuggestion.getEntries().get(0).getOptions();
|
||||
|
@ -334,9 +334,9 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
payloadFields.add("test_field" + i);
|
||||
}
|
||||
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg")
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg")
|
||||
.size(suggestionSize).payload(payloadFields);
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(prefix).execute().actionGet();
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", prefix).execute().actionGet();
|
||||
assertNoFailures(suggestResponse);
|
||||
CompletionSuggestion completionSuggestion = suggestResponse.getSuggest().getSuggestion("foo");
|
||||
CompletionSuggestion.Entry options = completionSuggestion.getEntries().get(0);
|
||||
|
@ -434,8 +434,8 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
|
||||
refresh();
|
||||
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(
|
||||
new CompletionSuggestionBuilder("testSuggestions").field(FIELD).text("test").size(10)
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("testSuggestions",
|
||||
new CompletionSuggestionBuilder().field(FIELD).text("test").size(10)
|
||||
).execute().actionGet();
|
||||
|
||||
assertSuggestions(suggestResponse, "testSuggestions", "testing");
|
||||
|
@ -635,16 +635,16 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
.get();
|
||||
assertThat(putMappingResponse.isAcknowledged(), is(true));
|
||||
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(
|
||||
SuggestBuilders.completionSuggestion("suggs").field(FIELD + ".suggest").text("f").size(10)
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("suggs",
|
||||
SuggestBuilders.completionSuggestion().field(FIELD + ".suggest").text("f").size(10)
|
||||
).execute().actionGet();
|
||||
assertSuggestions(suggestResponse, "suggs");
|
||||
|
||||
client().prepareIndex(INDEX, TYPE, "1").setRefresh(true).setSource(jsonBuilder().startObject().field(FIELD, "Foo Fighters").endObject()).get();
|
||||
ensureGreen(INDEX);
|
||||
|
||||
SuggestResponse afterReindexingResponse = client().prepareSuggest(INDEX).addSuggestion(
|
||||
SuggestBuilders.completionSuggestion("suggs").field(FIELD + ".suggest").text("f").size(10)
|
||||
SuggestResponse afterReindexingResponse = client().prepareSuggest(INDEX).addSuggestion("suggs",
|
||||
SuggestBuilders.completionSuggestion().field(FIELD + ".suggest").text("f").size(10)
|
||||
).execute().actionGet();
|
||||
assertSuggestions(afterReindexingResponse, "suggs", "Foo Fighters");
|
||||
}
|
||||
|
@ -660,13 +660,13 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
|
||||
refresh();
|
||||
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(
|
||||
SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("Nirv").size(10)
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo",
|
||||
SuggestBuilders.completionSuggestion().field(FIELD).prefix("Nirv").size(10)
|
||||
).execute().actionGet();
|
||||
assertSuggestions(suggestResponse, false, "foo", "Nirvana");
|
||||
|
||||
suggestResponse = client().prepareSuggest(INDEX).addSuggestion(
|
||||
SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("Nirw", Fuzziness.ONE).size(10)
|
||||
suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo",
|
||||
SuggestBuilders.completionSuggestion().field(FIELD).prefix("Nirw", Fuzziness.ONE).size(10)
|
||||
).execute().actionGet();
|
||||
assertSuggestions(suggestResponse, false, "foo", "Nirvana");
|
||||
}
|
||||
|
@ -683,14 +683,14 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
refresh();
|
||||
|
||||
// edit distance 1
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(
|
||||
SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("Norw", Fuzziness.ONE).size(10)
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo",
|
||||
SuggestBuilders.completionSuggestion().field(FIELD).prefix("Norw", Fuzziness.ONE).size(10)
|
||||
).execute().actionGet();
|
||||
assertSuggestions(suggestResponse, false, "foo");
|
||||
|
||||
// edit distance 2
|
||||
suggestResponse = client().prepareSuggest(INDEX).addSuggestion(
|
||||
SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("Norw", Fuzziness.TWO).size(10)
|
||||
suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo",
|
||||
SuggestBuilders.completionSuggestion().field(FIELD).prefix("Norw", Fuzziness.TWO).size(10)
|
||||
).execute().actionGet();
|
||||
assertSuggestions(suggestResponse, false, "foo", "Nirvana");
|
||||
}
|
||||
|
@ -706,13 +706,13 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
|
||||
refresh();
|
||||
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(
|
||||
SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("Nriv", FuzzyOptions.builder().setTranspositions(false).build()).size(10)
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo",
|
||||
SuggestBuilders.completionSuggestion().field(FIELD).prefix("Nriv", FuzzyOptions.builder().setTranspositions(false).build()).size(10)
|
||||
).execute().actionGet();
|
||||
assertSuggestions(suggestResponse, false, "foo");
|
||||
|
||||
suggestResponse = client().prepareSuggest(INDEX).addSuggestion(
|
||||
SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("Nriv", Fuzziness.ONE).size(10)
|
||||
suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo",
|
||||
SuggestBuilders.completionSuggestion().field(FIELD).prefix("Nriv", Fuzziness.ONE).size(10)
|
||||
).execute().actionGet();
|
||||
assertSuggestions(suggestResponse, false, "foo", "Nirvana");
|
||||
}
|
||||
|
@ -728,13 +728,13 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
|
||||
refresh();
|
||||
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(
|
||||
SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("Nriva", FuzzyOptions.builder().setFuzzyMinLength(6).build()).size(10)
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo",
|
||||
SuggestBuilders.completionSuggestion().field(FIELD).prefix("Nriva", FuzzyOptions.builder().setFuzzyMinLength(6).build()).size(10)
|
||||
).execute().actionGet();
|
||||
assertSuggestions(suggestResponse, false, "foo");
|
||||
|
||||
suggestResponse = client().prepareSuggest(INDEX).addSuggestion(
|
||||
SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("Nrivan", FuzzyOptions.builder().setFuzzyMinLength(6).build()).size(10)
|
||||
suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo",
|
||||
SuggestBuilders.completionSuggestion().field(FIELD).prefix("Nrivan", FuzzyOptions.builder().setFuzzyMinLength(6).build()).size(10)
|
||||
).execute().actionGet();
|
||||
assertSuggestions(suggestResponse, false, "foo", "Nirvana");
|
||||
}
|
||||
|
@ -750,13 +750,13 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
|
||||
refresh();
|
||||
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(
|
||||
SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("Nirw", FuzzyOptions.builder().setFuzzyPrefixLength(4).build()).size(10)
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo",
|
||||
SuggestBuilders.completionSuggestion().field(FIELD).prefix("Nirw", FuzzyOptions.builder().setFuzzyPrefixLength(4).build()).size(10)
|
||||
).execute().actionGet();
|
||||
assertSuggestions(suggestResponse, false, "foo");
|
||||
|
||||
suggestResponse = client().prepareSuggest(INDEX).addSuggestion(
|
||||
SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("Nirvo", FuzzyOptions.builder().setFuzzyPrefixLength(4).build()).size(10)
|
||||
suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo",
|
||||
SuggestBuilders.completionSuggestion().field(FIELD).prefix("Nirvo", FuzzyOptions.builder().setFuzzyPrefixLength(4).build()).size(10)
|
||||
).execute().actionGet();
|
||||
assertSuggestions(suggestResponse, false, "foo", "Nirvana");
|
||||
}
|
||||
|
@ -774,19 +774,19 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
|
||||
// suggestion with a character, which needs unicode awareness
|
||||
org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder completionSuggestionBuilder =
|
||||
SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("öööи", FuzzyOptions.builder().setUnicodeAware(true).build()).size(10);
|
||||
SuggestBuilders.completionSuggestion().field(FIELD).prefix("öööи", FuzzyOptions.builder().setUnicodeAware(true).build()).size(10);
|
||||
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(completionSuggestionBuilder).execute().actionGet();
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion("foo", completionSuggestionBuilder).execute().actionGet();
|
||||
assertSuggestions(suggestResponse, false, "foo", "ööööö");
|
||||
|
||||
// removing unicode awareness leads to no result
|
||||
completionSuggestionBuilder = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("öööи", FuzzyOptions.builder().setUnicodeAware(false).build()).size(10);
|
||||
suggestResponse = client().prepareSuggest(INDEX).addSuggestion(completionSuggestionBuilder).execute().actionGet();
|
||||
completionSuggestionBuilder = SuggestBuilders.completionSuggestion().field(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("foo").field(FIELD).prefix("öööи", FuzzyOptions.builder().setUnicodeAware(false).setFuzziness(Fuzziness.TWO).build()).size(10);
|
||||
suggestResponse = client().prepareSuggest(INDEX).addSuggestion(completionSuggestionBuilder).execute().actionGet();
|
||||
completionSuggestionBuilder = SuggestBuilders.completionSuggestion().field(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(SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("f")).get();
|
||||
client().prepareSuggest(INDEX).addSuggestion(SuggestBuilders.completionSuggestion("foo").field(otherField).prefix("f")).get();
|
||||
client().prepareSuggest(INDEX).addSuggestion("foo", SuggestBuilders.completionSuggestion().field(FIELD).prefix("f")).get();
|
||||
client().prepareSuggest(INDEX).addSuggestion("foo", SuggestBuilders.completionSuggestion().field(otherField).prefix("f")).get();
|
||||
|
||||
// Get all stats
|
||||
IndicesStatsResponse indicesStatsResponse = client().admin().indices().prepareStats(INDEX).setIndices(INDEX).setCompletion(true).get();
|
||||
|
@ -914,21 +914,21 @@ public class CompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
|
||||
|
||||
public void assertSuggestions(String suggestionName, SuggestionBuilder suggestBuilder, String... suggestions) {
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(suggestBuilder
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(suggestionName, suggestBuilder
|
||||
).execute().actionGet();
|
||||
assertSuggestions(suggestResponse, suggestionName, suggestions);
|
||||
|
||||
}
|
||||
public void assertSuggestions(String suggestion, String... suggestions) {
|
||||
String suggestionName = RandomStrings.randomAsciiOfLength(random(), 10);
|
||||
CompletionSuggestionBuilder suggestionBuilder = SuggestBuilders.completionSuggestion(suggestionName).field(FIELD).text(suggestion).size(10);
|
||||
CompletionSuggestionBuilder suggestionBuilder = SuggestBuilders.completionSuggestion().field(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(
|
||||
SuggestBuilders.completionSuggestion(suggestionName).field(FIELD).text(suggestString).size(10)
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(suggestionName,
|
||||
SuggestBuilders.completionSuggestion().field(FIELD).text(suggestString).size(10)
|
||||
).execute().actionGet();
|
||||
|
||||
assertSuggestions(suggestResponse, false, suggestionName, suggestions);
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
package org.elasticsearch.search.suggest;
|
||||
|
||||
import com.carrotsearch.randomizedtesting.generators.RandomStrings;
|
||||
|
||||
import org.apache.lucene.spatial.util.GeoHashUtils;
|
||||
import org.apache.lucene.util.LuceneTestCase.SuppressCodecs;
|
||||
import org.elasticsearch.action.index.IndexRequestBuilder;
|
||||
|
@ -89,7 +90,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
}
|
||||
indexRandom(true, indexRequestBuilders);
|
||||
ensureYellow(INDEX);
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg");
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg");
|
||||
assertSuggestions("foo", prefix, "suggestion9", "suggestion8", "suggestion7", "suggestion6", "suggestion5");
|
||||
}
|
||||
|
||||
|
@ -121,7 +122,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
}
|
||||
indexRandom(true, indexRequestBuilders);
|
||||
ensureYellow(INDEX);
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).regex("sugg.*es");
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).regex("sugg.*es");
|
||||
assertSuggestions("foo", prefix, "sugg9estion", "sugg8estion", "sugg7estion", "sugg6estion", "sugg5estion");
|
||||
}
|
||||
|
||||
|
@ -153,7 +154,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
}
|
||||
indexRandom(true, indexRequestBuilders);
|
||||
ensureYellow(INDEX);
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg", Fuzziness.ONE);
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg", Fuzziness.ONE);
|
||||
assertSuggestions("foo", prefix, "sugxgestion9", "sugxgestion8", "sugxgestion7", "sugxgestion6", "sugxgestion5");
|
||||
}
|
||||
|
||||
|
@ -178,7 +179,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
}
|
||||
indexRandom(true, indexRequestBuilders);
|
||||
ensureYellow(INDEX);
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg")
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg")
|
||||
.categoryContexts("cat", CategoryQueryContext.builder().setCategory("cat0").build());
|
||||
|
||||
assertSuggestions("foo", prefix, "suggestion8", "suggestion6", "suggestion4", "suggestion2", "suggestion0");
|
||||
|
@ -205,7 +206,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
}
|
||||
indexRandom(true, indexRequestBuilders);
|
||||
ensureYellow(INDEX);
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg")
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg")
|
||||
.categoryContexts("cat",
|
||||
CategoryQueryContext.builder().setCategory("cat0").setBoost(3).build(),
|
||||
CategoryQueryContext.builder().setCategory("cat1").build()
|
||||
|
@ -235,7 +236,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
}
|
||||
indexRandom(true, indexRequestBuilders);
|
||||
ensureYellow(INDEX);
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg");
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg");
|
||||
|
||||
assertSuggestions("foo", prefix, "suggestion9", "suggestion8", "suggestion7", "suggestion6", "suggestion5");
|
||||
}
|
||||
|
@ -265,17 +266,17 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
ensureYellow(INDEX);
|
||||
|
||||
// filter only on context cat
|
||||
CompletionSuggestionBuilder catFilterSuggest = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg");
|
||||
CompletionSuggestionBuilder catFilterSuggest = SuggestBuilders.completionSuggestion().field(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("foo").field(FIELD).prefix("sugg");
|
||||
CompletionSuggestionBuilder typeFilterSuggest = SuggestBuilders.completionSuggestion().field(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("foo").field(FIELD).prefix("sugg");
|
||||
CompletionSuggestionBuilder multiContextFilterSuggest = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg");
|
||||
// query context order should never matter
|
||||
if (randomBoolean()) {
|
||||
multiContextFilterSuggest.categoryContexts("type", CategoryQueryContext.builder().setCategory("type2").build());
|
||||
|
@ -313,21 +314,21 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
ensureYellow(INDEX);
|
||||
|
||||
// boost only on context cat
|
||||
CompletionSuggestionBuilder catBoostSuggest = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg");
|
||||
CompletionSuggestionBuilder catBoostSuggest = SuggestBuilders.completionSuggestion().field(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("foo").field(FIELD).prefix("sugg");
|
||||
CompletionSuggestionBuilder typeBoostSuggest = SuggestBuilders.completionSuggestion().field(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("foo").field(FIELD).prefix("sugg");
|
||||
CompletionSuggestionBuilder multiContextBoostSuggest = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg");
|
||||
// query context order should never matter
|
||||
if (randomBoolean()) {
|
||||
multiContextBoostSuggest.categoryContexts("type",
|
||||
|
@ -374,7 +375,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
}
|
||||
indexRandom(true, indexRequestBuilders);
|
||||
ensureYellow(INDEX);
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg");
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg");
|
||||
assertSuggestions("foo", prefix, "suggestion9", "suggestion8", "suggestion7", "suggestion6", "suggestion5");
|
||||
}
|
||||
|
||||
|
@ -405,7 +406,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
indexRandom(true, indexRequestBuilders);
|
||||
ensureYellow(INDEX);
|
||||
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg");
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg");
|
||||
assertSuggestions("foo", prefix, "suggestion0", "suggestion1", "suggestion2", "suggestion3", "suggestion4");
|
||||
}
|
||||
|
||||
|
@ -431,7 +432,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
}
|
||||
indexRandom(true, indexRequestBuilders);
|
||||
ensureYellow(INDEX);
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg");
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg");
|
||||
assertSuggestions("foo", prefix, "suggestion9", "suggestion8", "suggestion7", "suggestion6", "suggestion5");
|
||||
}
|
||||
|
||||
|
@ -458,10 +459,10 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
}
|
||||
indexRandom(true, indexRequestBuilders);
|
||||
ensureYellow(INDEX);
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg");
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg");
|
||||
assertSuggestions("foo", prefix, "suggestion9", "suggestion8", "suggestion7", "suggestion6", "suggestion5");
|
||||
|
||||
CompletionSuggestionBuilder geoFilteringPrefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg")
|
||||
CompletionSuggestionBuilder geoFilteringPrefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg")
|
||||
.geoContexts("geo", GeoQueryContext.builder().setGeoPoint(new GeoPoint(geoPoints[0])).build());
|
||||
|
||||
assertSuggestions("foo", geoFilteringPrefix, "suggestion8", "suggestion6", "suggestion4", "suggestion2", "suggestion0");
|
||||
|
@ -490,12 +491,12 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
}
|
||||
indexRandom(true, indexRequestBuilders);
|
||||
ensureYellow(INDEX);
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg");
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(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("foo").field(FIELD).prefix("sugg")
|
||||
CompletionSuggestionBuilder geoBoostingPrefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg")
|
||||
.geoContexts("geo", context1, context2);
|
||||
|
||||
assertSuggestions("foo", geoBoostingPrefix, "suggestion8", "suggestion6", "suggestion4", "suggestion9", "suggestion7");
|
||||
|
@ -526,7 +527,7 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
}
|
||||
indexRandom(true, indexRequestBuilders);
|
||||
ensureYellow(INDEX);
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg")
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg")
|
||||
.geoContexts("geo", GeoQueryContext.builder().setGeoPoint(new GeoPoint(52.2263, 4.543)).build());
|
||||
assertSuggestions("foo", prefix, "suggestion9", "suggestion8", "suggestion7", "suggestion6", "suggestion5");
|
||||
}
|
||||
|
@ -564,10 +565,10 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
}
|
||||
indexRandom(true, indexRequestBuilders);
|
||||
ensureYellow(INDEX);
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg");
|
||||
CompletionSuggestionBuilder prefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg");
|
||||
assertSuggestions("foo", prefix, "suggestion9", "suggestion8", "suggestion7", "suggestion6", "suggestion5");
|
||||
|
||||
CompletionSuggestionBuilder geoNeighbourPrefix = SuggestBuilders.completionSuggestion("foo").field(FIELD).prefix("sugg")
|
||||
CompletionSuggestionBuilder geoNeighbourPrefix = SuggestBuilders.completionSuggestion().field(FIELD).prefix("sugg")
|
||||
.geoContexts("geo", GeoQueryContext.builder().setGeoPoint(GeoPoint.fromGeohash(geohash)).build());
|
||||
|
||||
assertSuggestions("foo", geoNeighbourPrefix, "suggestion9", "suggestion8", "suggestion7", "suggestion6", "suggestion5");
|
||||
|
@ -624,16 +625,16 @@ public class ContextCompletionSuggestSearchIT extends ESIntegTestCase {
|
|||
refresh();
|
||||
|
||||
String suggestionName = randomAsciiOfLength(10);
|
||||
CompletionSuggestionBuilder context = SuggestBuilders.completionSuggestion(suggestionName).field(FIELD).text("h").size(10)
|
||||
CompletionSuggestionBuilder context = SuggestBuilders.completionSuggestion().field(FIELD).text("h").size(10)
|
||||
.geoContexts("st", GeoQueryContext.builder().setGeoPoint(new GeoPoint(52.52, 13.4)).build());
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(context).get();
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(suggestionName, context).get();
|
||||
|
||||
assertEquals(suggestResponse.getSuggest().size(), 1);
|
||||
assertEquals("Hotel Amsterdam in Berlin", suggestResponse.getSuggest().getSuggestion(suggestionName).iterator().next().getOptions().iterator().next().getText().string());
|
||||
}
|
||||
|
||||
public void assertSuggestions(String suggestionName, SuggestionBuilder suggestBuilder, String... suggestions) {
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(suggestBuilder
|
||||
SuggestResponse suggestResponse = client().prepareSuggest(INDEX).addSuggestion(suggestionName, suggestBuilder
|
||||
).execute().actionGet();
|
||||
CompletionSuggestSearchIT.assertSuggestions(suggestResponse, suggestionName, suggestions);
|
||||
}
|
||||
|
|
|
@ -67,7 +67,7 @@ public class CustomSuggesterSearchIT extends ESIntegTestCase {
|
|||
String randomField = randomAsciiOfLength(10);
|
||||
String randomSuffix = randomAsciiOfLength(10);
|
||||
SuggestBuilder suggestBuilder = new SuggestBuilder();
|
||||
suggestBuilder.addSuggestion(new CustomSuggestionBuilder("someName", randomField, randomSuffix).text(randomText));
|
||||
suggestBuilder.addSuggestion("someName", new CustomSuggestionBuilder(randomField, randomSuffix).text(randomText));
|
||||
SearchRequestBuilder searchRequestBuilder = client().prepareSearch("test").setTypes("test").setFrom(0).setSize(1)
|
||||
.suggest(suggestBuilder);
|
||||
|
||||
|
@ -84,13 +84,12 @@ public class CustomSuggesterSearchIT extends ESIntegTestCase {
|
|||
|
||||
static class CustomSuggestionBuilder extends SuggestionBuilder<CustomSuggestionBuilder> {
|
||||
|
||||
public final static CustomSuggestionBuilder PROTOTYPE = new CustomSuggestionBuilder("_na_", "_na_", "_na_");
|
||||
public final static CustomSuggestionBuilder PROTOTYPE = new CustomSuggestionBuilder("_na_", "_na_");
|
||||
|
||||
private String randomField;
|
||||
private String randomSuffix;
|
||||
|
||||
public CustomSuggestionBuilder(String name, String randomField, String randomSuffix) {
|
||||
super(name);
|
||||
public CustomSuggestionBuilder(String randomField, String randomSuffix) {
|
||||
this.randomField = randomField;
|
||||
this.randomSuffix = randomSuffix;
|
||||
}
|
||||
|
@ -114,8 +113,8 @@ public class CustomSuggesterSearchIT extends ESIntegTestCase {
|
|||
}
|
||||
|
||||
@Override
|
||||
public CustomSuggestionBuilder doReadFrom(StreamInput in, String name) throws IOException {
|
||||
return new CustomSuggestionBuilder(in.readString(), in.readString(), in.readString());
|
||||
public CustomSuggestionBuilder doReadFrom(StreamInput in) throws IOException {
|
||||
return new CustomSuggestionBuilder(in.readString(), in.readString());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -130,10 +129,10 @@ public class CustomSuggesterSearchIT extends ESIntegTestCase {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected CustomSuggestionBuilder innerFromXContent(QueryParseContext parseContext, String name)
|
||||
protected CustomSuggestionBuilder innerFromXContent(QueryParseContext parseContext)
|
||||
throws IOException {
|
||||
// TODO some parsing
|
||||
return new CustomSuggestionBuilder(name, randomField, randomSuffix);
|
||||
return new CustomSuggestionBuilder(randomField, randomSuffix);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -42,6 +42,7 @@ import org.elasticsearch.search.suggest.term.TermSuggestionBuilder;
|
|||
|
||||
import java.io.IOException;
|
||||
import java.util.Collections;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
public class SuggestBuilderTests extends WritableTestCase<SuggestBuilder> {
|
||||
|
||||
|
@ -91,7 +92,7 @@ public class SuggestBuilderTests extends WritableTestCase<SuggestBuilder> {
|
|||
}
|
||||
int numberOfSuggestions = randomIntBetween(0, 5);
|
||||
for (int i = 0; i < numberOfSuggestions; i++) {
|
||||
suggestBuilder.addSuggestion(PhraseSuggestionBuilderTests.randomPhraseSuggestionBuilder());
|
||||
suggestBuilder.addSuggestion(randomAsciiOfLength(10), PhraseSuggestionBuilderTests.randomPhraseSuggestionBuilder());
|
||||
}
|
||||
return suggestBuilder;
|
||||
}
|
||||
|
@ -99,17 +100,34 @@ public class SuggestBuilderTests extends WritableTestCase<SuggestBuilder> {
|
|||
@Override
|
||||
protected SuggestBuilder createMutation(SuggestBuilder original) throws IOException {
|
||||
SuggestBuilder mutation = new SuggestBuilder().setGlobalText(original.getGlobalText());
|
||||
for (SuggestionBuilder<?> suggestionBuilder : original.getSuggestions()) {
|
||||
mutation.addSuggestion(suggestionBuilder);
|
||||
for (Entry<String, SuggestionBuilder<?>> suggestionBuilder : original.getSuggestions().entrySet()) {
|
||||
mutation.addSuggestion(suggestionBuilder.getKey(), suggestionBuilder.getValue());
|
||||
}
|
||||
if (randomBoolean()) {
|
||||
mutation.setGlobalText(randomAsciiOfLengthBetween(5, 60));
|
||||
} else {
|
||||
mutation.addSuggestion(PhraseSuggestionBuilderTests.randomPhraseSuggestionBuilder());
|
||||
mutation.addSuggestion(randomAsciiOfLength(10), PhraseSuggestionBuilderTests.randomPhraseSuggestionBuilder());
|
||||
}
|
||||
return mutation;
|
||||
}
|
||||
|
||||
public void testIllegalSuggestionName() {
|
||||
try {
|
||||
new SuggestBuilder().addSuggestion(null, PhraseSuggestionBuilderTests.randomPhraseSuggestionBuilder());
|
||||
fail("exception expected");
|
||||
} catch (NullPointerException e) {
|
||||
assertEquals("every suggestion needs a name", e.getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
new SuggestBuilder().addSuggestion("my-suggest", PhraseSuggestionBuilderTests.randomPhraseSuggestionBuilder())
|
||||
.addSuggestion("my-suggest", PhraseSuggestionBuilderTests.randomPhraseSuggestionBuilder());
|
||||
fail("exception expected");
|
||||
} catch (IllegalArgumentException e) {
|
||||
assertEquals("already added another suggestion with name [my-suggest]", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected SuggestBuilder readFrom(StreamInput in) throws IOException {
|
||||
return SuggestBuilder.PROTOTYPE.readFrom(in);
|
||||
|
|
|
@ -21,7 +21,6 @@ package org.elasticsearch.search.suggest.completion;
|
|||
|
||||
import org.elasticsearch.common.unit.Fuzziness;
|
||||
import org.elasticsearch.search.suggest.AbstractSuggestionBuilderTestCase;
|
||||
import org.elasticsearch.search.suggest.SuggestionSearchContext;
|
||||
import org.elasticsearch.search.suggest.SuggestionSearchContext.SuggestionContext;
|
||||
import org.elasticsearch.search.suggest.completion.context.CategoryQueryContext;
|
||||
import org.elasticsearch.search.suggest.completion.context.GeoQueryContext;
|
||||
|
@ -30,7 +29,6 @@ import org.junit.BeforeClass;
|
|||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
|
@ -44,7 +42,7 @@ public class CompletionSuggesterBuilderTests extends AbstractSuggestionBuilderTe
|
|||
|
||||
@Override
|
||||
protected CompletionSuggestionBuilder randomSuggestionBuilder() {
|
||||
CompletionSuggestionBuilder testBuilder = new CompletionSuggestionBuilder(randomAsciiOfLength(10));
|
||||
CompletionSuggestionBuilder testBuilder = new CompletionSuggestionBuilder();
|
||||
switch (randomIntBetween(0, 3)) {
|
||||
case 0:
|
||||
testBuilder.prefix(randomAsciiOfLength(10));
|
||||
|
@ -96,6 +94,7 @@ public class CompletionSuggesterBuilderTests extends AbstractSuggestionBuilderTe
|
|||
// skip for now
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void mutateSpecificParameters(CompletionSuggestionBuilder builder) throws IOException {
|
||||
switch (randomIntBetween(0, 5)) {
|
||||
case 0:
|
||||
|
|
|
@ -47,7 +47,7 @@ public class PhraseSuggestionBuilderTests extends AbstractSuggestionBuilderTestC
|
|||
}
|
||||
|
||||
public static PhraseSuggestionBuilder randomPhraseSuggestionBuilder() {
|
||||
PhraseSuggestionBuilder testBuilder = new PhraseSuggestionBuilder(randomAsciiOfLength(10));
|
||||
PhraseSuggestionBuilder testBuilder = new PhraseSuggestionBuilder();
|
||||
maybeSet(testBuilder::maxErrors, randomFloat());
|
||||
maybeSet(testBuilder::separator, randomAsciiOfLengthBetween(1, 10));
|
||||
maybeSet(testBuilder::realWordErrorLikelihood, randomFloat());
|
||||
|
|
|
@ -40,7 +40,7 @@ public class TermSuggestionBuilderTests extends AbstractSuggestionBuilderTestCas
|
|||
*/
|
||||
@Override
|
||||
protected TermSuggestionBuilder randomSuggestionBuilder() {
|
||||
TermSuggestionBuilder testBuilder = new TermSuggestionBuilder(randomAsciiOfLength(10));
|
||||
TermSuggestionBuilder testBuilder = new TermSuggestionBuilder();
|
||||
maybeSet(testBuilder::suggestMode, randomSuggestMode());
|
||||
maybeSet(testBuilder::accuracy, randomFloat());
|
||||
maybeSet(testBuilder::sort, randomSort());
|
||||
|
@ -124,7 +124,7 @@ public class TermSuggestionBuilderTests extends AbstractSuggestionBuilderTestCas
|
|||
}
|
||||
|
||||
public void testInvalidParameters() throws IOException {
|
||||
TermSuggestionBuilder builder = new TermSuggestionBuilder(randomAsciiOfLength(10));
|
||||
TermSuggestionBuilder builder = new TermSuggestionBuilder();
|
||||
// test invalid accuracy values
|
||||
try {
|
||||
builder.accuracy(-0.5f);
|
||||
|
@ -237,7 +237,7 @@ public class TermSuggestionBuilderTests extends AbstractSuggestionBuilderTestCas
|
|||
}
|
||||
|
||||
public void testDefaultValuesSet() {
|
||||
TermSuggestionBuilder builder = new TermSuggestionBuilder(randomAsciiOfLength(10));
|
||||
TermSuggestionBuilder builder = new TermSuggestionBuilder();
|
||||
assertThat(builder.accuracy(), notNullValue());
|
||||
assertThat(builder.maxEdits(), notNullValue());
|
||||
assertThat(builder.maxInspections(), notNullValue());
|
||||
|
|
|
@ -20,6 +20,38 @@
|
|||
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;
|
||||
|
@ -49,37 +81,6 @@ 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.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
|
||||
|
@ -103,12 +104,12 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
index("test", "type1", "4", "text", "abcc");
|
||||
refresh();
|
||||
|
||||
TermSuggestionBuilder termSuggest = termSuggestion("test")
|
||||
TermSuggestionBuilder termSuggest = termSuggestion()
|
||||
.suggestMode(TermSuggestionBuilder.SuggestMode.ALWAYS) // Always, otherwise the results can vary between requests.
|
||||
.text("abcd")
|
||||
.field("text");
|
||||
logger.info("--> run suggestions with one index");
|
||||
searchSuggest( termSuggest);
|
||||
searchSuggest("test", termSuggest);
|
||||
createIndex("test_1");
|
||||
ensureGreen();
|
||||
|
||||
|
@ -117,13 +118,13 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
index("test_1", "type1", "3", "text", "ab bd");
|
||||
index("test_1", "type1", "4", "text", "ab cc");
|
||||
refresh();
|
||||
termSuggest = termSuggestion("test")
|
||||
termSuggest = termSuggestion()
|
||||
.suggestMode(SuggestMode.ALWAYS) // Always, otherwise the results can vary between requests.
|
||||
.text("ab cd")
|
||||
.minWordLength(1)
|
||||
.field("text");
|
||||
logger.info("--> run suggestions with two indices");
|
||||
searchSuggest( termSuggest);
|
||||
searchSuggest("test", termSuggest);
|
||||
|
||||
|
||||
XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject("type1")
|
||||
|
@ -144,14 +145,14 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
index("test_2", "type1", "4", "text", "abcc");
|
||||
refresh();
|
||||
|
||||
termSuggest = termSuggestion("test")
|
||||
termSuggest = termSuggestion()
|
||||
.suggestMode(SuggestMode.ALWAYS) // Always, otherwise the results can vary between requests.
|
||||
.text("ab cd")
|
||||
.minWordLength(1)
|
||||
.field("text");
|
||||
logger.info("--> run suggestions with three indices");
|
||||
try {
|
||||
searchSuggest( termSuggest);
|
||||
searchSuggest("test", termSuggest);
|
||||
fail(" can not suggest across multiple indices with different analysis chains");
|
||||
} catch (ReduceSearchPhaseException ex) {
|
||||
assertThat(ex.getCause(), instanceOf(IllegalStateException.class));
|
||||
|
@ -164,14 +165,14 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
}
|
||||
|
||||
|
||||
termSuggest = termSuggestion("test")
|
||||
termSuggest = termSuggestion()
|
||||
.suggestMode(SuggestMode.ALWAYS) // Always, otherwise the results can vary between requests.
|
||||
.text("ABCD")
|
||||
.minWordLength(1)
|
||||
.field("text");
|
||||
logger.info("--> run suggestions with four indices");
|
||||
try {
|
||||
searchSuggest( termSuggest);
|
||||
searchSuggest("test", termSuggest);
|
||||
fail(" can not suggest across multiple indices with different analysis chains");
|
||||
} catch (ReduceSearchPhaseException ex) {
|
||||
assertThat(ex.getCause(), instanceOf(IllegalStateException.class));
|
||||
|
@ -218,14 +219,14 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
refresh();
|
||||
|
||||
DirectCandidateGeneratorBuilder generator = candidateGenerator("name").prefixLength(0).minWordLength(0).suggestMode("always").maxEdits(2);
|
||||
PhraseSuggestionBuilder phraseSuggestion = phraseSuggestion("did_you_mean").field("name.shingled")
|
||||
PhraseSuggestionBuilder phraseSuggestion = phraseSuggestion().field("name.shingled")
|
||||
.addCandidateGenerator(generator)
|
||||
.gramSize(3);
|
||||
Suggest searchSuggest = searchSuggest( "ice tea", phraseSuggestion);
|
||||
Suggest searchSuggest = searchSuggest("ice tea", "did_you_mean", phraseSuggestion);
|
||||
assertSuggestion(searchSuggest, 0, "did_you_mean", "iced tea");
|
||||
|
||||
generator.suggestMode(null);
|
||||
searchSuggest = searchSuggest( "ice tea", phraseSuggestion);
|
||||
searchSuggest = searchSuggest( "ice tea", "did_you_mean", phraseSuggestion);
|
||||
assertSuggestionSize(searchSuggest, 0, 0, "did_you_mean");
|
||||
}
|
||||
|
||||
|
@ -254,16 +255,16 @@ 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("test")
|
||||
TermSuggestionBuilder termSuggestion = termSuggestion()
|
||||
.suggestMode(SuggestMode.ALWAYS) // Always, otherwise the results can vary between requests.
|
||||
.text("abcd")
|
||||
.field("text")
|
||||
.size(10);
|
||||
Suggest suggest = searchSuggest( termSuggestion);
|
||||
Suggest suggest = searchSuggest("test", termSuggestion);
|
||||
assertSuggestion(suggest, 0, "test", 10, "abc0");
|
||||
|
||||
termSuggestion.text("abcd").shardSize(5);
|
||||
suggest = searchSuggest( termSuggestion);
|
||||
suggest = searchSuggest("test", termSuggestion);
|
||||
assertSuggestion(suggest, 0, "test", 5, "abc0");
|
||||
}
|
||||
|
||||
|
@ -297,21 +298,21 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
client().prepareIndex("test", "type1").setSource("name", "I like ice cream."));
|
||||
refresh();
|
||||
|
||||
PhraseSuggestionBuilder phraseSuggestion = phraseSuggestion("did_you_mean").field("name.shingled")
|
||||
PhraseSuggestionBuilder phraseSuggestion = phraseSuggestion().field("name.shingled")
|
||||
.addCandidateGenerator(candidateGenerator("name").prefixLength(0).minWordLength(0).suggestMode("always").maxEdits(2))
|
||||
.gramSize(3);
|
||||
Suggest searchSuggest = searchSuggest( "ice tea", phraseSuggestion);
|
||||
Suggest searchSuggest = searchSuggest("ice tea", "did_you_mean", phraseSuggestion);
|
||||
assertSuggestion(searchSuggest, 0, 0, "did_you_mean", "iced tea");
|
||||
|
||||
phraseSuggestion.field("nosuchField");
|
||||
{
|
||||
SearchRequestBuilder searchBuilder = client().prepareSearch().setSize(0);
|
||||
searchBuilder.suggest(new SuggestBuilder().setGlobalText("tetsting sugestion").addSuggestion(phraseSuggestion));
|
||||
searchBuilder.suggest(new SuggestBuilder().setGlobalText("tetsting sugestion").addSuggestion("did_you_mean", phraseSuggestion));
|
||||
assertThrows(searchBuilder, SearchPhaseExecutionException.class);
|
||||
}
|
||||
{
|
||||
SearchRequestBuilder searchBuilder = client().prepareSearch().setSize(0);
|
||||
searchBuilder.suggest(new SuggestBuilder().setGlobalText("tetsting sugestion").addSuggestion(phraseSuggestion));
|
||||
searchBuilder.suggest(new SuggestBuilder().setGlobalText("tetsting sugestion").addSuggestion("did_you_mean", phraseSuggestion));
|
||||
assertThrows(searchBuilder, SearchPhaseExecutionException.class);
|
||||
}
|
||||
}
|
||||
|
@ -329,15 +330,15 @@ 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("test")
|
||||
TermSuggestionBuilder termSuggest = termSuggestion()
|
||||
.suggestMode(SuggestMode.ALWAYS) // Always, otherwise the results can vary between requests.
|
||||
.text("abcd")
|
||||
.field("text");
|
||||
Suggest suggest = searchSuggest( termSuggest);
|
||||
Suggest suggest = searchSuggest("test", termSuggest);
|
||||
assertSuggestion(suggest, 0, "test", "aacd", "abbd", "abcc");
|
||||
assertThat(suggest.getSuggestion("test").getEntries().get(0).getText().string(), equalTo("abcd"));
|
||||
|
||||
suggest = searchSuggest( termSuggest);
|
||||
suggest = searchSuggest("test", termSuggest);
|
||||
assertSuggestion(suggest, 0, "test", "aacd","abbd", "abcc");
|
||||
assertThat(suggest.getSuggestion("test").getEntries().get(0).getText().string(), equalTo("abcd"));
|
||||
}
|
||||
|
@ -349,15 +350,15 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
index("test", "type1", "1", "foo", "bar");
|
||||
refresh();
|
||||
|
||||
TermSuggestionBuilder termSuggest = termSuggestion("test")
|
||||
TermSuggestionBuilder termSuggest = termSuggestion()
|
||||
.suggestMode(SuggestMode.ALWAYS) // Always, otherwise the results can vary between requests.
|
||||
.text("abcd")
|
||||
.field("text");
|
||||
Suggest suggest = searchSuggest( termSuggest);
|
||||
Suggest suggest = searchSuggest("test", termSuggest);
|
||||
assertSuggestionSize(suggest, 0, 0, "test");
|
||||
assertThat(suggest.getSuggestion("test").getEntries().get(0).getText().string(), equalTo("abcd"));
|
||||
|
||||
suggest = searchSuggest( termSuggest);
|
||||
suggest = searchSuggest("test", termSuggest);
|
||||
assertSuggestionSize(suggest, 0, 0, "test");
|
||||
assertThat(suggest.getSuggestion("test").getEntries().get(0).getText().string(), equalTo("abcd"));
|
||||
}
|
||||
|
@ -372,16 +373,17 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
index("test", "typ1", "4", "field1", "prefix_abcc", "field2", "prefix_eggg");
|
||||
refresh();
|
||||
|
||||
Suggest suggest = searchSuggest(
|
||||
termSuggestion("size1")
|
||||
.size(1).text("prefix_abcd").maxTermFreq(10).prefixLength(1).minDocFreq(0)
|
||||
.field("field1").suggestMode(SuggestMode.ALWAYS),
|
||||
termSuggestion("field2")
|
||||
.field("field2").text("prefix_eeeh prefix_efgh")
|
||||
.maxTermFreq(10).minDocFreq(0).suggestMode(SuggestMode.ALWAYS),
|
||||
termSuggestion("accuracy")
|
||||
.field("field2").text("prefix_efgh").accuracy(1f)
|
||||
.maxTermFreq(10).minDocFreq(0).suggestMode(SuggestMode.ALWAYS));
|
||||
Map<String, SuggestionBuilder<?>> suggestions = new HashMap<>();
|
||||
suggestions.put("size1", termSuggestion()
|
||||
.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")
|
||||
.maxTermFreq(10).minDocFreq(0).suggestMode(SuggestMode.ALWAYS));
|
||||
suggestions.put("accuracy", termSuggestion()
|
||||
.field("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");
|
||||
assertThat(suggest.getSuggestion("field2").getEntries().get(0).getText().string(), equalTo("prefix_eeeh"));
|
||||
assertSuggestion(suggest, 0, "field2", "prefix_efgh");
|
||||
|
@ -415,17 +417,18 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
}
|
||||
refresh();
|
||||
|
||||
Suggest suggest = searchSuggest( "prefix_abcd",
|
||||
termSuggestion("size3SortScoreFirst")
|
||||
.size(3).minDocFreq(0).field("field1").suggestMode(SuggestMode.ALWAYS),
|
||||
termSuggestion("size10SortScoreFirst")
|
||||
.size(10).minDocFreq(0).field("field1").suggestMode(SuggestMode.ALWAYS).shardSize(50),
|
||||
termSuggestion("size3SortScoreFirstMaxEdits1")
|
||||
.maxEdits(1)
|
||||
.size(10).minDocFreq(0).field("field1").suggestMode(SuggestMode.ALWAYS),
|
||||
termSuggestion("size10SortFrequencyFirst")
|
||||
.size(10).sort(SortBy.FREQUENCY).shardSize(1000)
|
||||
.minDocFreq(0).field("field1").suggestMode(SuggestMode.ALWAYS));
|
||||
Map<String, SuggestionBuilder<?>> 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()
|
||||
.maxEdits(1)
|
||||
.size(10).minDocFreq(0).field("field1").suggestMode(SuggestMode.ALWAYS));
|
||||
suggestions.put("size10SortFrequencyFirst", termSuggestion()
|
||||
.size(10).sort(SortBy.FREQUENCY).shardSize(1000)
|
||||
.minDocFreq(0).field("field1").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.
|
||||
assertSuggestion(suggest, 0, "size3SortScoreFirst", "prefix_aacd", "prefix_abcc", "prefix_accd");
|
||||
|
@ -449,8 +452,8 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
index("test", "typ1", "1", "body", "this is a test");
|
||||
refresh();
|
||||
|
||||
Suggest searchSuggest = searchSuggest( "a an the",
|
||||
phraseSuggestion("simple_phrase").field("body").gramSize(1)
|
||||
Suggest searchSuggest = searchSuggest( "a an the", "simple_phrase",
|
||||
phraseSuggestion().field("body").gramSize(1)
|
||||
.addCandidateGenerator(candidateGenerator("body").minWordLength(1).suggestMode("always"))
|
||||
.size(1));
|
||||
assertSuggestionSize(searchSuggest, 0, 0, "simple_phrase");
|
||||
|
@ -485,14 +488,14 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
index("test", "type1", "3", "body", "hello words");
|
||||
refresh();
|
||||
|
||||
Suggest searchSuggest = searchSuggest( "hello word",
|
||||
phraseSuggestion("simple_phrase").field("body")
|
||||
Suggest searchSuggest = searchSuggest( "hello word", "simple_phrase",
|
||||
phraseSuggestion().field("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",
|
||||
phraseSuggestion("simple_phrase").field("body")
|
||||
searchSuggest = searchSuggest( "hello word", "simple_phrase",
|
||||
phraseSuggestion().field("body")
|
||||
.addCandidateGenerator(candidateGenerator("body").prefixLength(2).minWordLength(1).suggestMode("always"))
|
||||
.size(1).confidence(1.0f));
|
||||
assertSuggestion(searchSuggest, 0, "simple_phrase", "hello world");
|
||||
|
@ -540,88 +543,88 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
}
|
||||
refresh();
|
||||
|
||||
PhraseSuggestionBuilder phraseSuggest = phraseSuggestion("simple_phrase")
|
||||
PhraseSuggestionBuilder phraseSuggest = phraseSuggestion()
|
||||
.field("bigram").gramSize(2).analyzer("body")
|
||||
.addCandidateGenerator(candidateGenerator("body").minWordLength(1).suggestMode("always"))
|
||||
.size(1);
|
||||
Suggest searchSuggest = searchSuggest( "american ame", phraseSuggest);
|
||||
Suggest searchSuggest = searchSuggest( "american ame", "simple_phrase", phraseSuggest);
|
||||
assertSuggestion(searchSuggest, 0, "simple_phrase", "american ace");
|
||||
assertThat(searchSuggest.getSuggestion("simple_phrase").getEntries().get(0).getText().string(), equalTo("american ame"));
|
||||
|
||||
phraseSuggest.realWordErrorLikelihood(0.95f);
|
||||
searchSuggest = searchSuggest( "Xor the Got-Jewel", phraseSuggest);
|
||||
searchSuggest = searchSuggest( "Xor the Got-Jewel", "simple_phrase", phraseSuggest);
|
||||
assertSuggestion(searchSuggest, 0, "simple_phrase", "xorr the god jewel");
|
||||
// Check the "text" field this one time.
|
||||
assertThat(searchSuggest.getSuggestion("simple_phrase").getEntries().get(0).getText().string(), equalTo("Xor the Got-Jewel"));
|
||||
|
||||
// Ask for highlighting
|
||||
phraseSuggest.highlight("<em>", "</em>");
|
||||
searchSuggest = searchSuggest( "Xor the Got-Jewel", phraseSuggest);
|
||||
searchSuggest = searchSuggest( "Xor the Got-Jewel", "simple_phrase", phraseSuggest);
|
||||
assertSuggestion(searchSuggest, 0, "simple_phrase", "xorr the god jewel");
|
||||
assertThat(searchSuggest.getSuggestion("simple_phrase").getEntries().get(0).getOptions().get(0).getHighlighted().string(), equalTo("<em>xorr</em> the <em>god</em> jewel"));
|
||||
|
||||
// pass in a correct phrase
|
||||
phraseSuggest.highlight(null, null).confidence(0f).size(1).maxErrors(0.5f);
|
||||
searchSuggest = searchSuggest( "Xorr the God-Jewel", phraseSuggest);
|
||||
searchSuggest = searchSuggest( "Xorr the God-Jewel", "simple_phrase", phraseSuggest);
|
||||
assertSuggestion(searchSuggest, 0, "simple_phrase", "xorr the god jewel");
|
||||
|
||||
// pass in a correct phrase - set confidence to 2
|
||||
phraseSuggest.confidence(2f);
|
||||
searchSuggest = searchSuggest( "Xorr the God-Jewel", phraseSuggest);
|
||||
searchSuggest = searchSuggest( "Xorr the God-Jewel", "simple_phrase", phraseSuggest);
|
||||
assertSuggestionSize(searchSuggest, 0, 0, "simple_phrase");
|
||||
|
||||
// pass in a correct phrase - set confidence to 0.99
|
||||
phraseSuggest.confidence(0.99f);
|
||||
searchSuggest = searchSuggest( "Xorr the God-Jewel", phraseSuggest);
|
||||
searchSuggest = searchSuggest( "Xorr the God-Jewel", "simple_phrase", phraseSuggest);
|
||||
assertSuggestion(searchSuggest, 0, "simple_phrase", "xorr the god jewel");
|
||||
|
||||
//test reverse suggestions with pre & post filter
|
||||
phraseSuggest
|
||||
.addCandidateGenerator(candidateGenerator("body").minWordLength(1).suggestMode("always"))
|
||||
.addCandidateGenerator(candidateGenerator("body_reverse").minWordLength(1).suggestMode("always").preFilter("reverse").postFilter("reverse"));
|
||||
searchSuggest = searchSuggest( "xor the yod-Jewel", phraseSuggest);
|
||||
searchSuggest = searchSuggest( "xor the yod-Jewel", "simple_phrase", phraseSuggest);
|
||||
assertSuggestion(searchSuggest, 0, "simple_phrase", "xorr the god jewel");
|
||||
|
||||
// set all mass to trigrams (not indexed)
|
||||
phraseSuggest.clearCandidateGenerators()
|
||||
.addCandidateGenerator(candidateGenerator("body").minWordLength(1).suggestMode("always"))
|
||||
.smoothingModel(new LinearInterpolation(1,0,0));
|
||||
searchSuggest = searchSuggest( "Xor the Got-Jewel", phraseSuggest);
|
||||
searchSuggest = searchSuggest( "Xor the Got-Jewel", "simple_phrase", phraseSuggest);
|
||||
assertSuggestionSize(searchSuggest, 0, 0, "simple_phrase");
|
||||
|
||||
// set all mass to bigrams
|
||||
phraseSuggest.smoothingModel(new LinearInterpolation(0,1,0));
|
||||
searchSuggest = searchSuggest( "Xor the Got-Jewel", phraseSuggest);
|
||||
searchSuggest = searchSuggest( "Xor the Got-Jewel", "simple_phrase", phraseSuggest);
|
||||
assertSuggestion(searchSuggest, 0, "simple_phrase", "xorr the god jewel");
|
||||
|
||||
// distribute mass
|
||||
phraseSuggest.smoothingModel(new LinearInterpolation(0.4,0.4,0.2));
|
||||
searchSuggest = searchSuggest( "Xor the Got-Jewel", phraseSuggest);
|
||||
searchSuggest = searchSuggest( "Xor the Got-Jewel", "simple_phrase", phraseSuggest);
|
||||
assertSuggestion(searchSuggest, 0, "simple_phrase", "xorr the god jewel");
|
||||
|
||||
searchSuggest = searchSuggest( "american ame", phraseSuggest);
|
||||
searchSuggest = searchSuggest( "american ame", "simple_phrase", phraseSuggest);
|
||||
assertSuggestion(searchSuggest, 0, "simple_phrase", "american ace");
|
||||
|
||||
// try all smoothing methods
|
||||
phraseSuggest.smoothingModel(new LinearInterpolation(0.4,0.4,0.2));
|
||||
searchSuggest = searchSuggest( "Xor the Got-Jewel", phraseSuggest);
|
||||
searchSuggest = searchSuggest( "Xor the Got-Jewel", "simple_phrase", phraseSuggest);
|
||||
assertSuggestion(searchSuggest, 0, "simple_phrase", "xorr the god jewel");
|
||||
|
||||
phraseSuggest.smoothingModel(new Laplace(0.2));
|
||||
searchSuggest = searchSuggest( "Xor the Got-Jewel", phraseSuggest);
|
||||
searchSuggest = searchSuggest( "Xor the Got-Jewel", "simple_phrase", phraseSuggest);
|
||||
assertSuggestion(searchSuggest, 0, "simple_phrase", "xorr the god jewel");
|
||||
|
||||
phraseSuggest.smoothingModel(new StupidBackoff(0.1));
|
||||
searchSuggest = searchSuggest( "Xor the Got-Jewel", phraseSuggest);
|
||||
searchSuggest = searchSuggest( "Xor the Got-Jewel", "simple_phrase",phraseSuggest);
|
||||
assertSuggestion(searchSuggest, 0, "simple_phrase", "xorr the god jewel");
|
||||
|
||||
// check tokenLimit
|
||||
phraseSuggest.smoothingModel(null).tokenLimit(4);
|
||||
searchSuggest = searchSuggest( "Xor the Got-Jewel", phraseSuggest);
|
||||
searchSuggest = searchSuggest( "Xor the Got-Jewel", "simple_phrase", phraseSuggest);
|
||||
assertSuggestionSize(searchSuggest, 0, 0, "simple_phrase");
|
||||
|
||||
phraseSuggest.tokenLimit(15).smoothingModel(new StupidBackoff(0.1));
|
||||
searchSuggest = searchSuggest( "Xor the Got-Jewel Xor the Got-Jewel Xor the Got-Jewel", phraseSuggest);
|
||||
searchSuggest = searchSuggest( "Xor the Got-Jewel Xor the Got-Jewel Xor the Got-Jewel", "simple_phrase", phraseSuggest);
|
||||
assertSuggestion(searchSuggest, 0, "simple_phrase", "xorr the god jewel xorr the god jewel xorr the god jewel");
|
||||
// Check the name this time because we're repeating it which is funky
|
||||
assertThat(searchSuggest.getSuggestion("simple_phrase").getEntries().get(0).getText().string(), equalTo("Xor the Got-Jewel Xor the Got-Jewel Xor the Got-Jewel"));
|
||||
|
@ -677,7 +680,7 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
index("test", "type1", "2", "body", line, "body_reverse", line, "bigram", line);
|
||||
refresh();
|
||||
|
||||
PhraseSuggestionBuilder phraseSuggestion = phraseSuggestion("simple_phrase")
|
||||
PhraseSuggestionBuilder phraseSuggestion = phraseSuggestion()
|
||||
.realWordErrorLikelihood(0.95f)
|
||||
.field("bigram")
|
||||
.gramSize(2)
|
||||
|
@ -686,13 +689,13 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
.smoothingModel(new StupidBackoff(0.1))
|
||||
.maxErrors(1.0f)
|
||||
.size(5);
|
||||
Suggest searchSuggest = searchSuggest( "Xorr the Gut-Jewel", phraseSuggestion);
|
||||
Suggest searchSuggest = searchSuggest("Xorr the Gut-Jewel", "simple_phrase", phraseSuggestion);
|
||||
assertSuggestionSize(searchSuggest, 0, 0, "simple_phrase");
|
||||
|
||||
// we allow a size of 2 now on the shard generator level so "god" will be found since it's LD2
|
||||
phraseSuggestion.clearCandidateGenerators()
|
||||
.addCandidateGenerator(candidateGenerator("body").minWordLength(1).prefixLength(1).suggestMode("always").size(2).accuracy(0.1f));
|
||||
searchSuggest = searchSuggest( "Xorr the Gut-Jewel", phraseSuggestion);
|
||||
searchSuggest = searchSuggest( "Xorr the Gut-Jewel", "simple_phrase", phraseSuggestion);
|
||||
assertSuggestion(searchSuggest, 0, "simple_phrase", "xorr the god jewel");
|
||||
}
|
||||
|
||||
|
@ -737,51 +740,52 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
NumShards numShards = getNumShards("test");
|
||||
|
||||
// Lets make sure some things throw exceptions
|
||||
PhraseSuggestionBuilder phraseSuggestion = phraseSuggestion("simple_phrase")
|
||||
PhraseSuggestionBuilder phraseSuggestion = phraseSuggestion()
|
||||
.field("bigram")
|
||||
.analyzer("body")
|
||||
.addCandidateGenerator(candidateGenerator("does_not_exist").minWordLength(1).suggestMode("always"))
|
||||
.realWordErrorLikelihood(0.95f)
|
||||
.maxErrors(0.5f)
|
||||
.size(1);
|
||||
Map<String, SuggestionBuilder<?>> suggestion = new HashMap<>();
|
||||
suggestion.put("simple_phrase", phraseSuggestion);
|
||||
try {
|
||||
searchSuggest( "Xor the Got-Jewel", numShards.numPrimaries, phraseSuggestion);
|
||||
searchSuggest("Xor the Got-Jewel", numShards.numPrimaries, suggestion);
|
||||
fail("field does not exists");
|
||||
} catch (SearchPhaseExecutionException e) {}
|
||||
|
||||
phraseSuggestion.clearCandidateGenerators().analyzer(null);
|
||||
try {
|
||||
searchSuggest( "Xor the Got-Jewel", numShards.numPrimaries, phraseSuggestion);
|
||||
searchSuggest("Xor the Got-Jewel", numShards.numPrimaries, suggestion);
|
||||
fail("analyzer does only produce ngrams");
|
||||
} catch (SearchPhaseExecutionException e) {
|
||||
}
|
||||
|
||||
phraseSuggestion.analyzer("bigram");
|
||||
try {
|
||||
searchSuggest( "Xor the Got-Jewel", numShards.numPrimaries, phraseSuggestion);
|
||||
searchSuggest("Xor the Got-Jewel", numShards.numPrimaries, suggestion);
|
||||
fail("analyzer does only produce ngrams");
|
||||
} catch (SearchPhaseExecutionException e) {
|
||||
}
|
||||
|
||||
// Now we'll make sure some things don't
|
||||
phraseSuggestion.forceUnigrams(false);
|
||||
searchSuggest( "Xor the Got-Jewel", phraseSuggestion);
|
||||
searchSuggest( "Xor the Got-Jewel", 0, suggestion);
|
||||
|
||||
// Field doesn't produce unigrams but the analyzer does
|
||||
phraseSuggestion.forceUnigrams(true).field("bigram").analyzer("ngram");
|
||||
searchSuggest( "Xor the Got-Jewel",
|
||||
phraseSuggestion);
|
||||
searchSuggest( "Xor the Got-Jewel", 0, suggestion);
|
||||
|
||||
phraseSuggestion.field("ngram").analyzer("myDefAnalyzer")
|
||||
.addCandidateGenerator(candidateGenerator("body").minWordLength(1).suggestMode("always"));
|
||||
Suggest suggest = searchSuggest( "Xor the Got-Jewel", phraseSuggestion);
|
||||
Suggest suggest = searchSuggest( "Xor the Got-Jewel", 0, suggestion);
|
||||
|
||||
// "xorr the god jewel" and and "xorn the god jewel" have identical scores (we are only using unigrams to score), so we tie break by
|
||||
// earlier term (xorn):
|
||||
assertSuggestion(suggest, 0, "simple_phrase", "xorn the god jewel");
|
||||
|
||||
phraseSuggestion.analyzer(null);
|
||||
suggest = searchSuggest( "Xor the Got-Jewel", phraseSuggestion);
|
||||
suggest = searchSuggest( "Xor the Got-Jewel", 0, suggestion);
|
||||
|
||||
// In this case xorr has a better score than xorn because we set the field back to the default (my_shingle2) analyzer, so the
|
||||
// probability that the term is not in the dictionary but is NOT a misspelling is relatively high in this case compared to the
|
||||
|
@ -796,8 +800,8 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
client().prepareIndex("test", "type1", "2").setSource("field1", "foobar2").setRouting("2"),
|
||||
client().prepareIndex("test", "type1", "3").setSource("field1", "foobar3").setRouting("3"));
|
||||
|
||||
Suggest suggest = searchSuggest( "foobar",
|
||||
termSuggestion("simple")
|
||||
Suggest suggest = searchSuggest( "foobar", "simple",
|
||||
termSuggestion()
|
||||
.size(10).minDocFreq(0).field("field1").suggestMode(SuggestMode.ALWAYS));
|
||||
ElasticsearchAssertions.assertSuggestionSize(suggest, 0, 3, "simple");
|
||||
}
|
||||
|
@ -837,15 +841,15 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
// When searching on a shard with a non existing mapping, we should fail
|
||||
SearchRequestBuilder request = client().prepareSearch().setSize(0)
|
||||
.suggest(
|
||||
new SuggestBuilder().setGlobalText("tetsting sugestion").addSuggestion(
|
||||
phraseSuggestion("did_you_mean").field("fielddoesnotexist").maxErrors(5.0f)));
|
||||
new SuggestBuilder().setGlobalText("tetsting sugestion").addSuggestion("did_you_mean",
|
||||
phraseSuggestion().field("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(
|
||||
phraseSuggestion("did_you_mean").field("name").maxErrors(5.0f)))
|
||||
new SuggestBuilder().setGlobalText("tetsting sugestion").addSuggestion("did_you_mean",
|
||||
phraseSuggestion().field("name").maxErrors(5.0f)))
|
||||
.get();
|
||||
ElasticsearchAssertions.assertNoFailures(searchResponse);
|
||||
ElasticsearchAssertions.assertSuggestion(searchResponse.getSuggest(), 0, 0, "did_you_mean", "testing suggestions");
|
||||
|
@ -883,8 +887,8 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
SearchResponse searchResponse = client().prepareSearch()
|
||||
.setSize(0)
|
||||
.suggest(
|
||||
new SuggestBuilder().setGlobalText("tetsting sugestion").addSuggestion(
|
||||
phraseSuggestion("did_you_mean").field("name").maxErrors(5.0f)))
|
||||
new SuggestBuilder().setGlobalText("tetsting sugestion").addSuggestion("did_you_mean",
|
||||
phraseSuggestion().field("name").maxErrors(5.0f)))
|
||||
.get();
|
||||
|
||||
assertNoFailures(searchResponse);
|
||||
|
@ -941,7 +945,7 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
}
|
||||
refresh();
|
||||
|
||||
Suggest searchSuggest = searchSuggest("nobel prize", phraseSuggestion("simple_phrase")
|
||||
Suggest searchSuggest = searchSuggest("nobel prize", "simple_phrase", phraseSuggestion()
|
||||
.field("body")
|
||||
.addCandidateGenerator(candidateGenerator("body").minWordLength(1).suggestMode("always").maxTermFreq(.99f))
|
||||
.confidence(2f)
|
||||
|
@ -949,7 +953,7 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
.size(1));
|
||||
assertSuggestionSize(searchSuggest, 0, 0, "simple_phrase");
|
||||
|
||||
searchSuggest = searchSuggest("noble prize", phraseSuggestion("simple_phrase")
|
||||
searchSuggest = searchSuggest("noble prize", "simple_phrase", phraseSuggestion()
|
||||
.field("body")
|
||||
.addCandidateGenerator(candidateGenerator("body").minWordLength(1).suggestMode("always").maxTermFreq(.99f))
|
||||
.confidence(2f)
|
||||
|
@ -1080,7 +1084,7 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
}
|
||||
indexRandom(true, builders);
|
||||
|
||||
PhraseSuggestionBuilder suggest = phraseSuggestion("title")
|
||||
PhraseSuggestionBuilder suggest = phraseSuggestion()
|
||||
.field("title")
|
||||
.addCandidateGenerator(candidateGenerator("title")
|
||||
.suggestMode("always")
|
||||
|
@ -1092,13 +1096,13 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
.maxErrors(2f)
|
||||
.shardSize(30000)
|
||||
.size(30000);
|
||||
Suggest searchSuggest = searchSuggest("united states house of representatives elections in washington 2006", suggest);
|
||||
Suggest searchSuggest = searchSuggest("united states house of representatives elections in washington 2006", "title", suggest);
|
||||
assertSuggestion(searchSuggest, 0, 0, "title", "united states house of representatives elections in washington 2006");
|
||||
assertSuggestionSize(searchSuggest, 0, 25480, "title"); // Just to prove that we've run through a ton of options
|
||||
|
||||
suggest.size(1);
|
||||
long start = System.currentTimeMillis();
|
||||
searchSuggest = searchSuggest("united states house of representatives elections in washington 2006", suggest);
|
||||
searchSuggest = searchSuggest("united states house of representatives elections in washington 2006", "title", suggest);
|
||||
long total = System.currentTimeMillis() - start;
|
||||
assertSuggestion(searchSuggest, 0, 0, "title", "united states house of representatives elections in washington 2006");
|
||||
// assertThat(total, lessThan(1000L)); // Takes many seconds without fix - just for debugging
|
||||
|
@ -1145,7 +1149,7 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
indexRandom(true, builders);
|
||||
|
||||
// suggest without collate
|
||||
PhraseSuggestionBuilder suggest = phraseSuggestion("title")
|
||||
PhraseSuggestionBuilder suggest = phraseSuggestion()
|
||||
.field("title")
|
||||
.addCandidateGenerator(candidateGenerator("title")
|
||||
.suggestMode("always")
|
||||
|
@ -1157,7 +1161,7 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
.maxErrors(2f)
|
||||
.shardSize(30000)
|
||||
.size(10);
|
||||
Suggest searchSuggest = searchSuggest("united states house of representatives elections in washington 2006", suggest);
|
||||
Suggest searchSuggest = searchSuggest("united states house of representatives elections in washington 2006", "title", suggest);
|
||||
assertSuggestionSize(searchSuggest, 0, 10, "title");
|
||||
|
||||
// suggest with collate
|
||||
|
@ -1170,11 +1174,11 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
.string();
|
||||
PhraseSuggestionBuilder filteredQuerySuggest = suggest.collateQuery(filterString);
|
||||
filteredQuerySuggest.collateParams(Collections.singletonMap("field", "title"));
|
||||
searchSuggest = searchSuggest("united states house of representatives elections in washington 2006", filteredQuerySuggest);
|
||||
searchSuggest = searchSuggest("united states house of representatives elections in washington 2006", "title", filteredQuerySuggest);
|
||||
assertSuggestionSize(searchSuggest, 0, 2, "title");
|
||||
|
||||
// collate suggest with no result (boundary case)
|
||||
searchSuggest = searchSuggest("Elections of Representatives Parliament", filteredQuerySuggest);
|
||||
searchSuggest = searchSuggest("Elections of Representatives Parliament", "title", filteredQuerySuggest);
|
||||
assertSuggestionSize(searchSuggest, 0, 0, "title");
|
||||
|
||||
NumShards numShards = getNumShards("test");
|
||||
|
@ -1188,8 +1192,10 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
.endObject()
|
||||
.string();
|
||||
PhraseSuggestionBuilder incorrectFilteredSuggest = suggest.collateQuery(incorrectFilterString);
|
||||
Map<String, SuggestionBuilder<?>> namedSuggestion = new HashMap<>();
|
||||
namedSuggestion.put("my_title_suggestion", incorrectFilteredSuggest);
|
||||
try {
|
||||
searchSuggest("united states house of representatives elections in washington 2006", numShards.numPrimaries, incorrectFilteredSuggest);
|
||||
searchSuggest("united states house of representatives elections in washington 2006", numShards.numPrimaries, namedSuggestion);
|
||||
fail("Post query error has been swallowed");
|
||||
} catch(ElasticsearchException e) {
|
||||
// expected
|
||||
|
@ -1205,7 +1211,7 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
.string();
|
||||
|
||||
PhraseSuggestionBuilder filteredFilterSuggest = suggest.collateQuery(filterStringAsFilter);
|
||||
searchSuggest = searchSuggest("united states house of representatives elections in washington 2006", filteredFilterSuggest);
|
||||
searchSuggest = searchSuggest("united states house of representatives elections in washington 2006", "title", filteredFilterSuggest);
|
||||
assertSuggestionSize(searchSuggest, 0, 2, "title");
|
||||
|
||||
// collate suggest with bad query
|
||||
|
@ -1219,7 +1225,7 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
|
||||
PhraseSuggestionBuilder in = suggest.collateQuery(filterStr);
|
||||
try {
|
||||
searchSuggest("united states house of representatives elections in washington 2006", numShards.numPrimaries, in);
|
||||
searchSuggest("united states house of representatives elections in washington 2006", numShards.numPrimaries, namedSuggestion);
|
||||
fail("Post filter error has been swallowed");
|
||||
} catch(ElasticsearchException e) {
|
||||
//expected
|
||||
|
@ -1237,7 +1243,7 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
|
||||
PhraseSuggestionBuilder phraseSuggestWithNoParams = suggest.collateQuery(collateWithParams);
|
||||
try {
|
||||
searchSuggest("united states house of representatives elections in washington 2006", numShards.numPrimaries, phraseSuggestWithNoParams);
|
||||
searchSuggest("united states house of representatives elections in washington 2006", numShards.numPrimaries, namedSuggestion);
|
||||
fail("Malformed query (lack of additional params) should fail");
|
||||
} catch (ElasticsearchException e) {
|
||||
// expected
|
||||
|
@ -1249,33 +1255,35 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
params.put("query_field", "title");
|
||||
|
||||
PhraseSuggestionBuilder phraseSuggestWithParams = suggest.collateQuery(collateWithParams).collateParams(params);
|
||||
searchSuggest = searchSuggest("united states house of representatives elections in washington 2006", phraseSuggestWithParams);
|
||||
searchSuggest = searchSuggest("united states house of representatives elections in washington 2006", "title", phraseSuggestWithParams);
|
||||
assertSuggestionSize(searchSuggest, 0, 2, "title");
|
||||
|
||||
// collate query request with prune set to true
|
||||
PhraseSuggestionBuilder phraseSuggestWithParamsAndReturn = suggest.collateQuery(collateWithParams).collateParams(params).collatePrune(true);
|
||||
searchSuggest = searchSuggest("united states house of representatives elections in washington 2006", phraseSuggestWithParamsAndReturn);
|
||||
searchSuggest = searchSuggest("united states house of representatives elections in washington 2006", "title", phraseSuggestWithParamsAndReturn);
|
||||
assertSuggestionSize(searchSuggest, 0, 10, "title");
|
||||
assertSuggestionPhraseCollateMatchExists(searchSuggest, "title", 2);
|
||||
}
|
||||
|
||||
protected Suggest searchSuggest(SuggestionBuilder<?>... suggestion) {
|
||||
return searchSuggest(null, suggestion);
|
||||
protected Suggest searchSuggest(String name, SuggestionBuilder<?> suggestion) {
|
||||
return searchSuggest(null, name, suggestion);
|
||||
}
|
||||
|
||||
protected Suggest searchSuggest(String suggestText, SuggestionBuilder<?>... suggestions) {
|
||||
return searchSuggest(suggestText, 0, suggestions);
|
||||
protected Suggest searchSuggest(String suggestText, String name, SuggestionBuilder<?> suggestion) {
|
||||
Map<String, SuggestionBuilder<?>> map = new HashMap<>();
|
||||
map.put(name, suggestion);
|
||||
return searchSuggest(suggestText, 0, map);
|
||||
}
|
||||
|
||||
protected Suggest searchSuggest(String suggestText, int expectShardsFailed, SuggestionBuilder<?>... suggestions) {
|
||||
protected Suggest searchSuggest(String suggestText, int expectShardsFailed, Map<String, SuggestionBuilder<?>> suggestions) {
|
||||
if (randomBoolean()) {
|
||||
SearchRequestBuilder builder = client().prepareSearch().setSize(0);
|
||||
SuggestBuilder suggestBuilder = new SuggestBuilder();
|
||||
if (suggestText != null) {
|
||||
suggestBuilder.setGlobalText(suggestText);
|
||||
}
|
||||
for (SuggestionBuilder<?> suggestion : suggestions) {
|
||||
suggestBuilder.addSuggestion(suggestion);
|
||||
for (Entry<String, SuggestionBuilder<?>> suggestion : suggestions.entrySet()) {
|
||||
suggestBuilder.addSuggestion(suggestion.getKey(), suggestion.getValue());
|
||||
}
|
||||
builder.suggest(suggestBuilder);
|
||||
SearchResponse actionGet = builder.execute().actionGet();
|
||||
|
@ -1286,8 +1294,8 @@ public class SuggestSearchTests extends ESIntegTestCase {
|
|||
if (suggestText != null) {
|
||||
builder.setSuggestText(suggestText);
|
||||
}
|
||||
for (SuggestionBuilder<?> suggestion : suggestions) {
|
||||
builder.addSuggestion(suggestion);
|
||||
for (Entry<String, SuggestionBuilder<?>> suggestion : suggestions.entrySet()) {
|
||||
builder.addSuggestion(suggestion.getKey(), suggestion.getValue());
|
||||
}
|
||||
|
||||
SuggestResponse actionGet = builder.execute().actionGet();
|
||||
|
|
Loading…
Reference in New Issue