Browse Source

This commit removes the ability to use `filter` for PhraseSuggester collate.
Only `query` can be used for collation.

Internally, a collate query is executed as an exists query. So specifying a
filter does not have any benefits.

Areek Zillur 10 years ago
parent
commit
fb8cd53582

+ 6 - 6
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 <<query-dsl-template-query,`template` query>>.
+    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 <<query-dsl-template-query,`template` query>>.
     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

+ 3 - 10
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)) {

+ 2 - 16
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<PhraseSuggestionContext> {
 
             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<PhraseSuggestionContext> {
                     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) {

+ 2 - 28
src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestionBuilder.java

@@ -42,8 +42,6 @@ public final class PhraseSuggestionBuilder extends SuggestionBuilder<PhraseSugge
     private String preTag;
     private String postTag;
     private String collateQuery;
-    private String collateFilter;
-    private String collatePreference;
     private Map<String, Object> collateParams;
     private Boolean collatePrune;
 
@@ -178,22 +176,6 @@ public final class PhraseSuggestionBuilder extends SuggestionBuilder<PhraseSugge
         return this;
     }
 
-    /**
-     * Sets a filter used for filtering out suggested phrases (collation).
-     */
-    public PhraseSuggestionBuilder collateFilter(String collateFilter) {
-        this.collateFilter = collateFilter;
-        return this;
-    }
-
-    /**
-     * Sets routing preferences for executing filter query (collation).
-     */
-    public PhraseSuggestionBuilder collatePreference(String collatePreference) {
-        this.collatePreference = collatePreference;
-        return this;
-    }
-
     /**
      * Sets additional params for collate script
      */
@@ -254,17 +236,9 @@ public final class PhraseSuggestionBuilder extends SuggestionBuilder<PhraseSugge
             builder.field("post_tag", postTag);
             builder.endObject();
         }
-        if (collateQuery != null || collateFilter != null) {
+        if (collateQuery != null) {
             builder.startObject("collate");
-            if (collateQuery != null) {
-                builder.field("query", collateQuery);
-            }
-            if (collateFilter != null) {
-                builder.field("filter", collateFilter);
-            }
-            if (collatePreference != null) {
-                builder.field("preference", collatePreference);
-            }
+            builder.field("query", collateQuery);
             if (collateParams != null) {
                 builder.field("params", collateParams);
             }

+ 0 - 8
src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestionContext.java

@@ -204,14 +204,6 @@ class PhraseSuggestionContext extends SuggestionContext {
         this.collateQueryScript = collateQueryScript;
     }
 
-    CompiledScript getCollateFilterScript() {
-        return collateFilterScript;
-    }
-
-    void setCollateFilterScript(CompiledScript collateFilterScript) {
-        this.collateFilterScript = collateFilterScript;
-    }
-
     Map<String, Object> getCollateScriptParams() {
         return collateScriptParams;
     }

+ 11 - 38
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);