@Override public void execute(SearchContext context) { final SuggestionSearchContext suggest = context.suggest(); if (suggest == null) { return; } try { CharsRefBuilder spare = new CharsRefBuilder(); final List<Suggestion<? extends Entry<? extends Option>>> suggestions = new ArrayList<>(suggest.suggestions().size()); for (Map.Entry<String, SuggestionSearchContext.SuggestionContext> entry : suggest.suggestions().entrySet()) { SuggestionSearchContext.SuggestionContext suggestion = entry.getValue(); Suggester<SuggestionContext> suggester = suggestion.getSuggester(); Suggestion<? extends Entry<? extends Option>> result = suggester.execute(entry.getKey(), suggestion, context.searcher(), spare); if (result != null) { assert entry.getKey().equals(result.name); suggestions.add(result); } } context.queryResult().suggest(new Suggest(suggestions)); } catch (IOException e) { throw new ElasticsearchException("I/O exception during suggest phase", e); } } }
public InternalSearchResponse(StreamInput in) throws IOException { super( SearchHits.readSearchHits(in), in.readBoolean() ? InternalAggregations.readAggregations(in) : null, in.readBoolean() ? Suggest.readSuggest(in) : null, in.readBoolean(), in.readOptionalBoolean(), in.readOptionalWriteable(SearchProfileShardResults::new), in.readVInt() ); }
@Override public String toString() { try { XContentBuilder builder = XContentFactory.jsonBuilder().prettyPrint(); builder.startObject(); toXContent(builder, EMPTY_PARAMS); builder.endObject(); return Strings.toString(builder); } catch (IOException e) { return "{ \"error\" : \"" + e.getMessage() + "\"}"; } } }
for (CompletionSuggestion suggestion : shardSuggest.filter(CompletionSuggestion.class)) { suggestion.setShardIndex(sortedResult.getShardIndex()); List<Suggestion<CompletionSuggestion.Entry>> suggestions = System.arraycopy(mergedScoreDocs, 0, scoreDocs, 0, mergedScoreDocs.length); int offset = mergedScoreDocs.length; Suggest suggestions = new Suggest(completionSuggestions); for (CompletionSuggestion completionSuggestion : suggestions.filter(CompletionSuggestion.class)) { for (CompletionSuggestion.Entry.Option option : completionSuggestion.getOptions()) { scoreDocs[offset++] = option.getDoc();
@Override protected SuggestResponse newResponse(SuggestRequest request, AtomicReferenceArray shardsResponses, ClusterState clusterState) { int successfulShards = 0; int failedShards = 0; final Map<String, List<Suggest.Suggestion>> groupedSuggestions = new HashMap<>(); List<ShardOperationFailedException> shardFailures = null; for (int i = 0; i < shardsResponses.length(); i++) { Object shardResponse = shardsResponses.get(i); if (shardResponse == null) { // simply ignore non active shards } else if (shardResponse instanceof BroadcastShardOperationFailedException) { failedShards++; if (shardFailures == null) { shardFailures = new ArrayList<>(); } shardFailures.add(new DefaultShardOperationFailedException((BroadcastShardOperationFailedException) shardResponse)); } else { Suggest suggest = ((ShardSuggestResponse) shardResponse).getSuggest(); Suggest.group(groupedSuggestions, suggest); successfulShards++; } } return new SuggestResponse(new Suggest(Suggest.reduce(groupedSuggestions)), shardsResponses.length(), successfulShards, failedShards, shardFailures); }
public Suggest(List<Suggestion<? extends Entry<? extends Option>>> suggestions) { // we sort suggestions by their names to ensure iteration over suggestions are consistent // this is needed as we need to fill in suggestion docs in SearchPhaseController#sortDocs // in the same order as we enrich the suggestions with fetch results in SearchPhaseController#merge suggestions.sort((o1, o2) -> o1.getName().compareTo(o2.getName())); this.suggestions = suggestions; this.hasScoreDocs = filter(CompletionSuggestion.class).stream().anyMatch(CompletionSuggestion::hasScoreDocs); }
int numSuggestDocs = 0; final List<CompletionSuggestion> completionSuggestions; if (suggest != null && suggest.hasScoreDocs()) { completionSuggestions = suggest.filter(CompletionSuggestion.class); for (CompletionSuggestion completionSuggestion : completionSuggestions) { numSuggestDocs += completionSuggestion.getOptions().size();
public static void assertSuggestionPhraseCollateMatchExists(Suggest searchSuggest, String key, int numberOfPhraseExists) { int counter = 0; assertThat(searchSuggest, notNullValue()); String msg = "Suggest result: " + searchSuggest.toString(); assertThat(msg, searchSuggest.size(), greaterThanOrEqualTo(1)); assertThat(msg, searchSuggest.getSuggestion(key).getName(), equalTo(key)); for (Suggest.Suggestion.Entry.Option option : searchSuggest.getSuggestion(key).getEntries().get(0).getOptions()) { if (option.collateMatch()) { counter++; } } assertThat(counter, equalTo(numberOfPhraseExists)); }
} else { out.writeBoolean(true); suggest.writeTo(out);
private List<CompletionSuggestion.Entry.Option> execute(SearchRequestBuilder sqb) { SearchResponse response = sqb.execute().actionGet(); CompletionSuggestion completionSuggestion = response.getSuggest().getSuggestion("completion"); if (completionSuggestion != null) { List<CompletionSuggestion.Entry> entryList = completionSuggestion.getEntries(); if (entryList != null && entryList.get(0) != null && entryList.get(0).getOptions() != null) { return entryList.get(0).getOptions(); } } return Collections.emptyList(); }
/** * Returns <code>true</code> if this result has any suggest score docs */ public boolean hasSuggestHits() { return (suggest != null && suggest.hasScoreDocs()); }
aggs = Aggregations.fromXContent(parser); } else if (Suggest.NAME.equals(currentFieldName)) { suggest = Suggest.fromXContent(parser); } else if (SearchProfileShardResults.PROFILE_FIELD.equals(currentFieldName)) { profile = SearchProfileShardResults.fromXContent(parser);
@Override public void readFrom(StreamInput in) throws IOException { super.readFrom(in); suggest.readFrom(in); }
for (CompletionSuggestion suggestion : shardSuggest.filter(CompletionSuggestion.class)) { suggestion.setShardIndex(sortedResult.getShardIndex()); List<Suggestion<CompletionSuggestion.Entry>> suggestions = System.arraycopy(mergedScoreDocs, 0, scoreDocs, 0, mergedScoreDocs.length); int offset = mergedScoreDocs.length; Suggest suggestions = new Suggest(completionSuggestions); for (CompletionSuggestion completionSuggestion : suggestions.filter(CompletionSuggestion.class)) { for (CompletionSuggestion.Entry.Option option : completionSuggestion.getOptions()) { scoreDocs[offset++] = option.getDoc();
@Override public void readFrom(StreamInput in) throws IOException { final int size = in.readVInt(); suggestions = new ArrayList<>(size); for (int i = 0; i < size; i++) { // TODO: remove these complicated generics Suggestion<? extends Entry<? extends Option>> suggestion; final int type = in.readVInt(); switch (type) { case TermSuggestion.TYPE: suggestion = new TermSuggestion(); break; case CompletionSuggestion.TYPE: suggestion = new CompletionSuggestion(); break; case 2: // CompletionSuggestion.TYPE throw new IllegalArgumentException("Completion suggester 2.x is not supported anymore"); case PhraseSuggestion.TYPE: suggestion = new PhraseSuggestion(); break; default: suggestion = new Suggestion(); break; } suggestion.readFrom(in); suggestions.add(suggestion); } hasScoreDocs = filter(CompletionSuggestion.class).stream().anyMatch(CompletionSuggestion::hasScoreDocs); }