Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deprecates indexing and querying a context completion field without context #31006

Merged
merged 2 commits into from
May 31, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion docs/reference/migration/migrate_6_0/search.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -207,4 +207,10 @@ for a particular index with the index setting `index.max_terms_count`.
For 6.x and starting in 6.3 a deprecation warning will be printed to warn
against search requests that contain extra tokens after the main object.
These extra tokens were ignored by the query parser before 6.3 but the next
major version will not accept invalid body anymore.
major version will not accept invalid body anymore.

==== Context suggester without contexts

The ability to query and index context enabled suggestions without contexts
has been deprecated. Context enabled suggestion queries without contexts have
to visit every suggestion, which degrades the search performance considerably.
10 changes: 7 additions & 3 deletions docs/reference/search/suggesters/context-suggest.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,10 @@ PUT place_path_category
NOTE: Adding context mappings increases the index size for completion field. The completion index
is entirely heap resident, you can monitor the completion field index size using <<indices-stats>>.

NOTE: deprecated[7.0.0, Indexing a suggestion without context on a context enabled completion field is deprecated
and will be removed in the next major release. If you want to index a suggestion that matches all contexts you should
add a special context for it.]

[[suggester-context-category]]
[float]
==== Category Context
Expand Down Expand Up @@ -156,9 +160,9 @@ POST place/_search?pretty
// CONSOLE
// TEST[continued]

NOTE: When no categories are provided at query-time, all indexed documents are considered.
Querying with no categories on a category enabled completion field should be avoided, as it
will degrade search performance.
Note: deprecated[7.0.0, When no categories are provided at query-time, all indexed documents are considered.
Querying with no categories on a category enabled completion field is deprecated and will be removed in the next major release
as it degrades search performance considerably.]

Suggestions with certain categories can be boosted higher than others.
The following filters suggestions by categories and additionally boosts
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -336,16 +336,80 @@ setup:
- length: { suggest.result.0.options: 1 }
- match: { suggest.result.0.options.0.text: "foo" }

---
"Indexing and Querying without contexts is deprecated":
- skip:
version: " - 6.3.99"
reason: this feature was deprecated in 6.4
features: "warnings"

- do:
index:
index: test
type: test
id: 1
body:
suggest_context:
input: "foo"
contexts:
color: "red"
suggest_multi_contexts:
input: "bar"
contexts:
color: "blue"

- do:
warnings:
- "The ability to index a suggestion with no context on a context enabled completion field is deprecated and will be removed in the next major release."
index:
index: test
type: test
id: 2
body:
suggest_context:
input: "foo"

- do:
indices.refresh: {}

- do:
search:
warnings:
- "The ability to query with no context on a context enabled completion field is deprecated and will be removed in the next major release."
search:
body:
suggest:
result:
text: "foo"
completion:
skip_duplicates: true
field: suggest_context

- length: { suggest.result: 1 }
- length: { suggest.result.0.options: 1 }
- match: { suggest.result.0.options.0.text: "foo" }

- do:
warnings:
- "The ability to query with no context on a context enabled completion field is deprecated and will be removed in the next major release."
search:
body:
suggest:
result:
text: "foo"
completion:
field: suggest_context
contexts: {}

- length: { suggest.result: 1 }

- do:
warnings:
- "The ability to query with no context on a context enabled completion field is deprecated and will be removed in the next major release."
search:
body:
suggest:
result:
text: "foo"
completion:
field: suggest_multi_contexts
contexts:
location: []

- length: { suggest.result: 1 }
Original file line number Diff line number Diff line change
Expand Up @@ -20,20 +20,19 @@ setup:
-
"name" : "format"
"type" : "category"
---
"Test typed keys parameter for suggesters":

- do:
bulk:
bulk:
refresh: true
index: test
type: test
body:
- '{"index": {}}'
- '{"title": "Elasticsearch in Action", "suggestions": {"input": "ELK in Action", "contexts": {"format": "ebook"}}}'
- '{"index": {}}'
- '{"title": "Elasticsearch - The Definitive Guide", "suggestions": {"input": ["Elasticsearch in Action"]}}'

---
"Test typed keys parameter for suggesters":
- '{"title": "Elasticsearch - The Definitive Guide", "suggestions": {"input": ["Elasticsearch in Action"], "contexts": {"format": "ebook"}}}'

- do:
search:
Expand All @@ -46,10 +45,6 @@ setup:
term_suggester:
term:
field: title
completion_suggester:
prefix: "Elastic"
completion:
field: suggestions
context_suggester:
prefix: "Elastic"
completion:
Expand All @@ -61,6 +56,5 @@ setup:
field: title

- is_true: suggest.term#term_suggester
- is_true: suggest.completion#completion_suggester
- is_true: suggest.completion#context_suggester
- is_true: suggest.phrase#phrase_suggester
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,6 @@
* for query-time filtering and boosting (see {@link ContextMappings}
*/
public class CompletionFieldMapper extends FieldMapper implements ArrayValueMapperParser {

public static final String CONTENT_TYPE = "completion";

public static class Defaults {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
* indexing.
*/
public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSuggestionBuilder> {

private static final XContentType CONTEXT_BYTES_XCONTENT_TYPE = XContentType.JSON;
static final String SUGGESTION_NAME = "completion";
static final ParseField CONTEXTS_FIELD = new ParseField("contexts", "context");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import org.apache.lucene.util.CharsRefBuilder;
import org.elasticsearch.ElasticsearchParseException;
import org.elasticsearch.Version;
import org.elasticsearch.common.logging.DeprecationLogger;
import org.elasticsearch.common.logging.Loggers;
import org.elasticsearch.common.xcontent.ToXContent;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.index.mapper.CompletionFieldMapper;
Expand All @@ -51,6 +53,10 @@
* for a {@link CompletionFieldMapper}
*/
public class ContextMappings implements ToXContent {

private static final DeprecationLogger DEPRECATION_LOGGER =
new DeprecationLogger(Loggers.getLogger(ContextMappings.class));

private final List<ContextMapping> contextMappings;
private final Map<String, ContextMapping> contextNameMap;

Expand Down Expand Up @@ -143,6 +149,10 @@ protected Iterable<CharSequence> contexts() {
scratch.setLength(1);
}
}
if (typedContexts.isEmpty()) {
DEPRECATION_LOGGER.deprecated("The ability to index a suggestion with no context on a context enabled completion field" +
" is deprecated and will be removed in the next major release.");
}
return typedContexts;
}
}
Expand All @@ -156,6 +166,7 @@ protected Iterable<CharSequence> contexts() {
*/
public ContextQuery toContextQuery(CompletionQuery query, Map<String, List<ContextMapping.InternalQueryContext>> queryContexts) {
ContextQuery typedContextQuery = new ContextQuery(query);
boolean hasContext = false;
if (queryContexts.isEmpty() == false) {
CharsRefBuilder scratch = new CharsRefBuilder();
scratch.grow(1);
Expand All @@ -169,10 +180,15 @@ public ContextQuery toContextQuery(CompletionQuery query, Map<String, List<Conte
scratch.append(context.context);
typedContextQuery.addContext(scratch.toCharsRef(), context.boost, !context.isPrefix);
scratch.setLength(1);
hasContext = true;
}
}
}
}
if (hasContext == false) {
DEPRECATION_LOGGER.deprecated("The ability to query with no context on a context enabled completion field is deprecated " +
"and will be removed in the next major release.");
}
return typedContextQuery;
}

Expand Down