Search in sources :

Example 1 with Option

use of org.opensearch.search.suggest.Suggest.Suggestion.Entry.Option in project OpenSearch by opensearch-project.

the class Suggest method reduce.

public static List<Suggestion<? extends Entry<? extends Option>>> reduce(Map<String, List<Suggest.Suggestion>> groupedSuggestions) {
    List<Suggestion<? extends Entry<? extends Option>>> reduced = new ArrayList<>(groupedSuggestions.size());
    for (Map.Entry<String, List<Suggestion>> unmergedResults : groupedSuggestions.entrySet()) {
        List<Suggestion> value = unmergedResults.getValue();
        Class<? extends Suggestion> suggestionClass = null;
        for (Suggestion suggestion : value) {
            if (suggestionClass == null) {
                suggestionClass = suggestion.getClass();
            } else if (suggestionClass != suggestion.getClass()) {
                throw new IllegalArgumentException("detected mixed suggestion results, due to querying on old and new completion suggester," + " query on a single completion suggester version");
            }
        }
        Suggestion reduce = value.get(0).reduce(value);
        reduce.trim();
        reduced.add(reduce);
    }
    return reduced;
}
Also used : TermSuggestion(org.opensearch.search.suggest.term.TermSuggestion) CompletionSuggestion(org.opensearch.search.suggest.completion.CompletionSuggestion) PhraseSuggestion(org.opensearch.search.suggest.phrase.PhraseSuggestion) Entry(org.opensearch.search.suggest.Suggest.Suggestion.Entry) ArrayList(java.util.ArrayList) Option(org.opensearch.search.suggest.Suggest.Suggestion.Entry.Option) ArrayList(java.util.ArrayList) List(java.util.List) HashMap(java.util.HashMap) Map(java.util.Map)

Example 2 with Option

use of org.opensearch.search.suggest.Suggest.Suggestion.Entry.Option in project OpenSearch by opensearch-project.

the class SuggestionTests method doTestFromXContent.

@SuppressWarnings({ "rawtypes" })
private void doTestFromXContent(boolean addRandomFields) throws IOException {
    ToXContent.Params params = new ToXContent.MapParams(Collections.singletonMap(RestSearchAction.TYPED_KEYS_PARAM, "true"));
    for (Class<Suggestion<? extends Entry<? extends Option>>> type : SUGGESTION_TYPES) {
        Suggestion suggestion = createTestItem(type);
        XContentType xContentType = randomFrom(XContentType.values());
        boolean humanReadable = randomBoolean();
        BytesReference originalBytes = toShuffledXContent(suggestion, xContentType, params, humanReadable);
        BytesReference mutated;
        if (addRandomFields) {
            // - "contexts" is an object consisting of key/array pairs, we shouldn't add anything random there
            // - there can be inner search hits fields inside this option where we cannot add random stuff
            // - the root object should be excluded since it contains the named suggestion arrays
            // We also exclude options that contain SearchHits, as all unknown fields
            // on a root level of SearchHit are interpreted as meta-fields and will be kept.
            Predicate<String> excludeFilter = path -> path.isEmpty() || path.endsWith(CompletionSuggestion.Entry.Option.CONTEXTS.getPreferredName()) || path.endsWith("highlight") || path.contains("fields") || path.contains("_source") || path.contains("inner_hits") || path.contains("options");
            mutated = insertRandomFields(xContentType, originalBytes, excludeFilter, random());
        } else {
            mutated = originalBytes;
        }
        Suggestion parsed;
        try (XContentParser parser = createParser(xContentType.xContent(), mutated)) {
            ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser);
            ensureExpectedToken(XContentParser.Token.FIELD_NAME, parser.nextToken(), parser);
            ensureExpectedToken(XContentParser.Token.START_ARRAY, parser.nextToken(), parser);
            parsed = Suggestion.fromXContent(parser);
            assertEquals(XContentParser.Token.END_OBJECT, parser.nextToken());
            assertNull(parser.nextToken());
        }
        assertEquals(suggestion.getName(), parsed.getName());
        assertEquals(suggestion.getEntries().size(), parsed.getEntries().size());
        // We don't parse size via xContent, instead we set it to -1 on the client side
        assertEquals(-1, parsed.getSize());
        assertToXContentEquivalent(originalBytes, toXContent(parsed, xContentType, params, humanReadable), xContentType);
    }
}
Also used : ToXContent(org.opensearch.common.xcontent.ToXContent) BytesReference(org.opensearch.common.bytes.BytesReference) TermSuggestion(org.opensearch.search.suggest.term.TermSuggestion) OpenSearchAssertions.assertToXContentEquivalent(org.opensearch.test.hamcrest.OpenSearchAssertions.assertToXContentEquivalent) BytesReference(org.opensearch.common.bytes.BytesReference) XContentTestUtils.insertRandomFields(org.opensearch.test.XContentTestUtils.insertRandomFields) ToXContent(org.opensearch.common.xcontent.ToXContent) Entry(org.opensearch.search.suggest.Suggest.Suggestion.Entry) Suggestion(org.opensearch.search.suggest.Suggest.Suggestion) Supplier(java.util.function.Supplier) XContentParser(org.opensearch.common.xcontent.XContentParser) RestSearchAction(org.opensearch.rest.action.search.RestSearchAction) XContentHelper.toXContent(org.opensearch.common.xcontent.XContentHelper.toXContent) NamedObjectNotFoundException(org.opensearch.common.xcontent.NamedObjectNotFoundException) Map(java.util.Map) Predicate(java.util.function.Predicate) OpenSearchTestCase(org.opensearch.test.OpenSearchTestCase) Set(java.util.Set) CompletionSuggestion(org.opensearch.search.suggest.completion.CompletionSuggestion) IOException(java.io.IOException) XContentParserUtils.ensureExpectedToken(org.opensearch.common.xcontent.XContentParserUtils.ensureExpectedToken) PhraseSuggestion(org.opensearch.search.suggest.phrase.PhraseSuggestion) XContent(org.opensearch.common.xcontent.XContent) Option(org.opensearch.search.suggest.Suggest.Suggestion.Entry.Option) NamedXContentRegistry(org.opensearch.common.xcontent.NamedXContentRegistry) JsonXContent(org.opensearch.common.xcontent.json.JsonXContent) XContentType(org.opensearch.common.xcontent.XContentType) DeprecationHandler(org.opensearch.common.xcontent.DeprecationHandler) Collections(java.util.Collections) Text(org.opensearch.common.text.Text) TermSuggestion(org.opensearch.search.suggest.term.TermSuggestion) Suggestion(org.opensearch.search.suggest.Suggest.Suggestion) CompletionSuggestion(org.opensearch.search.suggest.completion.CompletionSuggestion) PhraseSuggestion(org.opensearch.search.suggest.phrase.PhraseSuggestion) Entry(org.opensearch.search.suggest.Suggest.Suggestion.Entry) XContentType(org.opensearch.common.xcontent.XContentType) Option(org.opensearch.search.suggest.Suggest.Suggestion.Entry.Option) XContentParser(org.opensearch.common.xcontent.XContentParser)

Example 3 with Option

use of org.opensearch.search.suggest.Suggest.Suggestion.Entry.Option in project OpenSearch by opensearch-project.

the class SuggestionOptionTests method testToXContent.

public void testToXContent() throws IOException {
    Option option = new PhraseSuggestion.Entry.Option(new Text("someText"), new Text("somethingHighlighted"), 1.3f, true);
    BytesReference xContent = toXContent(option, XContentType.JSON, randomBoolean());
    assertEquals(("{" + "  \"text\": \"someText\"," + "  \"highlighted\": \"somethingHighlighted\"," + "  \"score\": 1.3," + "  \"collate_match\": true" + "}").replaceAll("\\s+", ""), xContent.utf8ToString());
}
Also used : BytesReference(org.opensearch.common.bytes.BytesReference) PhraseSuggestion(org.opensearch.search.suggest.phrase.PhraseSuggestion) Option(org.opensearch.search.suggest.Suggest.Suggestion.Entry.Option) Text(org.opensearch.common.text.Text)

Example 4 with Option

use of org.opensearch.search.suggest.Suggest.Suggestion.Entry.Option in project OpenSearch by opensearch-project.

the class SuggestPhase method execute.

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 OpenSearchException("I/O exception during suggest phase", e);
    }
}
Also used : ArrayList(java.util.ArrayList) IOException(java.io.IOException) SuggestionContext(org.opensearch.search.suggest.SuggestionSearchContext.SuggestionContext) Suggestion(org.opensearch.search.suggest.Suggest.Suggestion) Entry(org.opensearch.search.suggest.Suggest.Suggestion.Entry) SuggestionContext(org.opensearch.search.suggest.SuggestionSearchContext.SuggestionContext) Option(org.opensearch.search.suggest.Suggest.Suggestion.Entry.Option) OpenSearchException(org.opensearch.OpenSearchException) CharsRefBuilder(org.apache.lucene.util.CharsRefBuilder) Map(java.util.Map)

Example 5 with Option

use of org.opensearch.search.suggest.Suggest.Suggestion.Entry.Option in project OpenSearch by opensearch-project.

the class SuggestTests method testToXContent.

public void testToXContent() throws IOException {
    PhraseSuggestion.Entry.Option option = new PhraseSuggestion.Entry.Option(new Text("someText"), new Text("somethingHighlighted"), 1.3f, true);
    PhraseSuggestion.Entry entry = new PhraseSuggestion.Entry(new Text("entryText"), 42, 313);
    entry.addOption(option);
    PhraseSuggestion suggestion = new PhraseSuggestion("suggestionName", 5);
    suggestion.addTerm(entry);
    Suggest suggest = new Suggest(Collections.singletonList(suggestion));
    BytesReference xContent = toXContent(suggest, XContentType.JSON, randomBoolean());
    assertEquals(stripWhitespace("{" + "  \"suggest\": {" + "    \"suggestionName\": [" + "      {" + "        \"text\": \"entryText\"," + "        \"offset\": 42," + "        \"length\": 313," + "        \"options\": [" + "          {" + "            \"text\": \"someText\"," + "            \"highlighted\": \"somethingHighlighted\"," + "            \"score\": 1.3," + "            \"collate_match\": true" + "          }" + "        ]" + "      }" + "    ]" + "  }" + "}"), xContent.utf8ToString());
}
Also used : BytesReference(org.opensearch.common.bytes.BytesReference) Entry(org.opensearch.search.suggest.Suggest.Suggestion.Entry) PhraseSuggestion(org.opensearch.search.suggest.phrase.PhraseSuggestion) Option(org.opensearch.search.suggest.Suggest.Suggestion.Entry.Option) Text(org.opensearch.common.text.Text)

Aggregations

Option (org.opensearch.search.suggest.Suggest.Suggestion.Entry.Option)9 BytesReference (org.opensearch.common.bytes.BytesReference)5 Text (org.opensearch.common.text.Text)5 Entry (org.opensearch.search.suggest.Suggest.Suggestion.Entry)5 PhraseSuggestion (org.opensearch.search.suggest.phrase.PhraseSuggestion)5 Map (java.util.Map)3 XContentParser (org.opensearch.common.xcontent.XContentParser)3 XContentType (org.opensearch.common.xcontent.XContentType)3 CompletionSuggestion (org.opensearch.search.suggest.completion.CompletionSuggestion)3 TermSuggestion (org.opensearch.search.suggest.term.TermSuggestion)3 IOException (java.io.IOException)2 ArrayList (java.util.ArrayList)2 Suggestion (org.opensearch.search.suggest.Suggest.Suggestion)2 Collections (java.util.Collections)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Set (java.util.Set)1 Predicate (java.util.function.Predicate)1 Supplier (java.util.function.Supplier)1 CharsRefBuilder (org.apache.lucene.util.CharsRefBuilder)1