diff --git a/docs/reference/search/suggesters/phrase-suggest.asciidoc b/docs/reference/search/suggesters/phrase-suggest.asciidoc index 07332568685..9710b6a3f48 100644 --- a/docs/reference/search/suggesters/phrase-suggest.asciidoc +++ b/docs/reference/search/suggesters/phrase-suggest.asciidoc @@ -162,13 +162,13 @@ can contain misspellings (See parameter descriptions below). is wrapped rather than each token. `collate`:: - Checks each suggestion against the specified `query` or `filter` to - prune suggestions for which no matching docs exist in the index. - The collate query for a suggestion is run only on the local shard from which - the suggestion has been generated from. Either a `query` or a `filter` must - be specified, and it is run as a <>. + Checks each suggestion against the specified `query` to prune suggestions + for which no matching docs exist in the index. The collate query for a + suggestion is run only on the local shard from which the suggestion has + been generated from. The `query` must be specified, and it is run as + a <>. The current suggestion is automatically made available as the `{{suggestion}}` - variable, which should be used in your query/filter. You can still specify + variable, which should be used in your query. You can still specify your own template `params` -- the `suggestion` value will be added to the variables you specify. Additionally, you can specify a `prune` to control if all phrase suggestions will be returned, when set to `true` the suggestions diff --git a/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestParser.java b/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestParser.java index 4bb59952336..a5bc2d530bf 100644 --- a/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestParser.java +++ b/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestParser.java @@ -134,20 +134,13 @@ public final class PhraseSuggestParser implements SuggestContextParser { while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { fieldName = parser.currentName(); - } else if ("query".equals(fieldName) || "filter".equals(fieldName)) { - Template template = Template.parse(parser); - if (suggestion.getCollateFilterScript() != null) { - throw new IllegalArgumentException("suggester[phrase][collate] filter already set, doesn't support additional [" + fieldName + "]"); - } + } else if ("query".equals(fieldName)) { if (suggestion.getCollateQueryScript() != null) { throw new IllegalArgumentException("suggester[phrase][collate] query already set, doesn't support additional [" + fieldName + "]"); } + Template template = Template.parse(parser); CompiledScript compiledScript = suggester.scriptService().compile(template, ScriptContext.Standard.SEARCH); - if ("query".equals(fieldName)) { - suggestion.setCollateQueryScript(compiledScript); - } else { - suggestion.setCollateFilterScript(compiledScript); - } + suggestion.setCollateQueryScript(compiledScript); } else if ("params".equals(fieldName)) { suggestion.setCollateScriptParams(parser.map()); } else if ("prune".equals(fieldName)) { diff --git a/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggester.java b/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggester.java index 37ab17fffed..30c1b63de21 100644 --- a/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggester.java +++ b/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggester.java @@ -34,7 +34,6 @@ import org.elasticsearch.common.lucene.Lucene; import org.elasticsearch.common.lucene.Lucene.EarlyTerminatingCollector; import org.elasticsearch.common.text.StringText; import org.elasticsearch.common.text.Text; -import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.ParsedQuery; import org.elasticsearch.script.CompiledScript; import org.elasticsearch.script.ExecutableScript; @@ -105,14 +104,7 @@ public final class PhraseSuggester extends Suggester { final BytesRefBuilder byteSpare = new BytesRefBuilder(); final EarlyTerminatingCollector collector = Lucene.createExistsCollector(); - final CompiledScript collateScript; - if (suggestion.getCollateQueryScript() != null) { - collateScript = suggestion.getCollateQueryScript(); - } else if (suggestion.getCollateFilterScript() != null) { - collateScript = suggestion.getCollateFilterScript(); - } else { - collateScript = null; - } + final CompiledScript collateScript = suggestion.getCollateQueryScript(); final boolean collatePrune = (collateScript != null) && suggestion.collatePrune(); for (int i = 0; i < checkerResult.corrections.length; i++) { Correction correction = checkerResult.corrections[i]; @@ -125,13 +117,7 @@ public final class PhraseSuggester extends Suggester { vars.put(SUGGESTION_TEMPLATE_VAR_NAME, spare.toString()); final ExecutableScript executable = scriptService.executable(collateScript, vars); final BytesReference querySource = (BytesReference) executable.run(); - final ParsedQuery parsedQuery; - if (suggestion.getCollateFilterScript() != null) { - parsedQuery = suggestion.getQueryParserService().parse( - QueryBuilders.constantScoreQuery(QueryBuilders.wrapperQuery(querySource))); - } else { - parsedQuery = suggestion.getQueryParserService().parse(querySource); - } + final ParsedQuery parsedQuery = suggestion.getQueryParserService().parse(querySource); collateMatch = Lucene.exists(searcher, parsedQuery.query(), collector); } if (!collateMatch && !collatePrune) { diff --git a/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestionBuilder.java b/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestionBuilder.java index ef320eb60e5..ac990deffb7 100644 --- a/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestionBuilder.java +++ b/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestionBuilder.java @@ -42,8 +42,6 @@ public final class PhraseSuggestionBuilder extends SuggestionBuilder collateParams; private Boolean collatePrune; @@ -178,22 +176,6 @@ public final class PhraseSuggestionBuilder extends SuggestionBuilder getCollateScriptParams() { return collateScriptParams; } diff --git a/src/test/java/org/elasticsearch/search/suggest/SuggestSearchTests.java b/src/test/java/org/elasticsearch/search/suggest/SuggestSearchTests.java index 06d0c86b89a..b5c114ab380 100644 --- a/src/test/java/org/elasticsearch/search/suggest/SuggestSearchTests.java +++ b/src/test/java/org/elasticsearch/search/suggest/SuggestSearchTests.java @@ -1129,7 +1129,7 @@ public class SuggestSearchTests extends ElasticsearchIntegrationTest { } indexRandom(true, builders); - // suggest without filtering + // suggest without collate PhraseSuggestionBuilder suggest = phraseSuggestion("title") .field("title") .addCandidateGenerator(PhraseSuggestionBuilder.candidateGenerator("title") @@ -1145,7 +1145,7 @@ public class SuggestSearchTests extends ElasticsearchIntegrationTest { Suggest searchSuggest = searchSuggest("united states house of representatives elections in washington 2006", suggest); assertSuggestionSize(searchSuggest, 0, 10, "title"); - // suggest with filtering + // suggest with collate String filterString = XContentFactory.jsonBuilder() .startObject() .startObject("match_phrase") @@ -1157,13 +1157,13 @@ public class SuggestSearchTests extends ElasticsearchIntegrationTest { searchSuggest = searchSuggest("united states house of representatives elections in washington 2006", filteredQuerySuggest); assertSuggestionSize(searchSuggest, 0, 2, "title"); - // filtered suggest with no result (boundary case) + // collate suggest with no result (boundary case) searchSuggest = searchSuggest("Elections of Representatives Parliament", filteredQuerySuggest); assertSuggestionSize(searchSuggest, 0, 0, "title"); NumShards numShards = getNumShards("test"); - // filtered suggest with bad query + // collate suggest with bad query String incorrectFilterString = XContentFactory.jsonBuilder() .startObject() .startObject("test") @@ -1179,7 +1179,7 @@ public class SuggestSearchTests extends ElasticsearchIntegrationTest { // expected } - // suggest with filter collation + // suggest with collation String filterStringAsFilter = XContentFactory.jsonBuilder() .startObject() .startObject("query") @@ -1190,11 +1190,11 @@ public class SuggestSearchTests extends ElasticsearchIntegrationTest { .endObject() .string(); - PhraseSuggestionBuilder filteredFilterSuggest = suggest.collateQuery(null).collateFilter(filterStringAsFilter); + PhraseSuggestionBuilder filteredFilterSuggest = suggest.collateQuery(filterStringAsFilter); searchSuggest = searchSuggest("united states house of representatives elections in washington 2006", filteredFilterSuggest); assertSuggestionSize(searchSuggest, 0, 2, "title"); - // filtered suggest with bad filter + // collate suggest with bad query String filterStr = XContentFactory.jsonBuilder() .startObject() .startObject("pprefix") @@ -1203,7 +1203,7 @@ public class SuggestSearchTests extends ElasticsearchIntegrationTest { .endObject() .string(); - PhraseSuggestionBuilder in = suggest.collateQuery(null).collateFilter(filterStr); + PhraseSuggestionBuilder in = suggest.collateQuery(filterStr); try { searchSuggest("united states house of representatives elections in washington 2006", numShards.numPrimaries, in); fail("Post filter error has been swallowed"); @@ -1221,7 +1221,7 @@ public class SuggestSearchTests extends ElasticsearchIntegrationTest { .string(); - PhraseSuggestionBuilder phraseSuggestWithNoParams = suggest.collateFilter(null).collateQuery(collateWithParams); + PhraseSuggestionBuilder phraseSuggestWithNoParams = suggest.collateQuery(collateWithParams); try { searchSuggest("united states house of representatives elections in washington 2006", numShards.numPrimaries, phraseSuggestWithNoParams); fail("Malformed query (lack of additional params) should fail"); @@ -1234,39 +1234,12 @@ public class SuggestSearchTests extends ElasticsearchIntegrationTest { params.put("query_type", "match_phrase"); params.put("query_field", "title"); - PhraseSuggestionBuilder phraseSuggestWithParams = suggest.collateFilter(null).collateQuery(collateWithParams).collateParams(params); + PhraseSuggestionBuilder phraseSuggestWithParams = suggest.collateQuery(collateWithParams).collateParams(params); searchSuggest = searchSuggest("united states house of representatives elections in washington 2006", phraseSuggestWithParams); assertSuggestionSize(searchSuggest, 0, 2, "title"); - //collate request defining both query/filter should fail - PhraseSuggestionBuilder phraseSuggestWithFilterAndQuery = suggest.collateFilter(filterStringAsFilter).collateQuery(filterString); - try { - searchSuggest("united states house of representatives elections in washington 2006", numShards.numPrimaries, phraseSuggestWithFilterAndQuery); - fail("expected parse failure, as both filter and query are set in collate"); - } catch (ElasticsearchException e) { - // expected - } - // collate query request with prune set to true - PhraseSuggestionBuilder phraseSuggestWithParamsAndReturn = suggest.collateFilter(null).collateQuery(collateWithParams).collateParams(params).collatePrune(true); - searchSuggest = searchSuggest("united states house of representatives elections in washington 2006", phraseSuggestWithParamsAndReturn); - assertSuggestionSize(searchSuggest, 0, 10, "title"); - assertSuggestionPhraseCollateMatchExists(searchSuggest, "title", 2); - - collateWithParams = XContentFactory.jsonBuilder() - .startObject() - .startObject("query") - .startObject("{{query_type}}") - .field("{{query_field}}", "{{suggestion}}") - .endObject() - .endObject() - .endObject().string(); - - params.clear(); - params.put("query_type", "match_phrase"); - params.put("query_field", "title"); - // collate filter request with prune set to true - phraseSuggestWithParamsAndReturn = suggest.collateFilter(collateWithParams).collateQuery(null).collateParams(params).collatePrune(true); + PhraseSuggestionBuilder phraseSuggestWithParamsAndReturn = suggest.collateQuery(collateWithParams).collateParams(params).collatePrune(true); searchSuggest = searchSuggest("united states house of representatives elections in washington 2006", phraseSuggestWithParamsAndReturn); assertSuggestionSize(searchSuggest, 0, 10, "title"); assertSuggestionPhraseCollateMatchExists(searchSuggest, "title", 2);