Add more script contexts (#30721)
Added dedicated script contexts for: * script function score * script sorting * terms_set query Scripts for these contexts will either have a specific return value or use scoring and therefor in the future will need their own scripting classes. Relates to #30511
This commit is contained in:
parent
7cc38ab45a
commit
314cd6feaf
|
@ -54,7 +54,7 @@ public class ExpertScriptPlugin extends Plugin implements ScriptPlugin {
|
|||
|
||||
@Override
|
||||
public <T> T compile(String scriptName, String scriptSource, ScriptContext<T> context, Map<String, String> params) {
|
||||
if (context.equals(SearchScript.CONTEXT) == false) {
|
||||
if (context.equals(SearchScript.SCRIPT_SCORE_CONTEXT) == false) {
|
||||
throw new IllegalArgumentException(getType() + " scripts cannot be used for context [" + context.name + "]");
|
||||
}
|
||||
// we use the script "source" as the script identifier
|
||||
|
|
|
@ -249,7 +249,8 @@ public final class TermsSetQueryBuilder extends AbstractQueryBuilder<TermsSetQue
|
|||
IndexNumericFieldData fieldData = context.getForField(msmFieldType);
|
||||
longValuesSource = new FieldValuesSource(fieldData);
|
||||
} else if (minimumShouldMatchScript != null) {
|
||||
SearchScript.Factory factory = context.getScriptService().compile(minimumShouldMatchScript, SearchScript.CONTEXT);
|
||||
SearchScript.Factory factory = context.getScriptService().compile(minimumShouldMatchScript,
|
||||
SearchScript.TERMS_SET_QUERY_CONTEXT);
|
||||
Map<String, Object> params = new HashMap<>();
|
||||
params.putAll(minimumShouldMatchScript.getParams());
|
||||
params.put("num_terms", queries.size());
|
||||
|
|
|
@ -92,7 +92,7 @@ public class ScriptScoreFunctionBuilder extends ScoreFunctionBuilder<ScriptScore
|
|||
@Override
|
||||
protected ScoreFunction doToFunction(QueryShardContext context) {
|
||||
try {
|
||||
SearchScript.Factory factory = context.getScriptService().compile(script, SearchScript.CONTEXT);
|
||||
SearchScript.Factory factory = context.getScriptService().compile(script, SearchScript.SCRIPT_SCORE_CONTEXT);
|
||||
SearchScript.LeafFactory searchScript = factory.newFactory(script.getParams(), context.lookup());
|
||||
return new ScriptScoreFunction(script, searchScript);
|
||||
} catch (Exception e) {
|
||||
|
|
|
@ -42,6 +42,9 @@ public class ScriptModule {
|
|||
CORE_CONTEXTS = Stream.of(
|
||||
SearchScript.CONTEXT,
|
||||
SearchScript.AGGS_CONTEXT,
|
||||
SearchScript.SCRIPT_SCORE_CONTEXT,
|
||||
SearchScript.SCRIPT_SORT_CONTEXT,
|
||||
SearchScript.TERMS_SET_QUERY_CONTEXT,
|
||||
ExecutableScript.CONTEXT,
|
||||
ExecutableScript.AGGS_CONTEXT,
|
||||
ExecutableScript.UPDATE_CONTEXT,
|
||||
|
|
|
@ -158,6 +158,12 @@ public abstract class SearchScript implements ScorerAware, ExecutableScript {
|
|||
|
||||
/** The context used to compile {@link SearchScript} factories. */
|
||||
public static final ScriptContext<Factory> CONTEXT = new ScriptContext<>("search", Factory.class);
|
||||
// TODO: remove aggs context when it has its own interface
|
||||
// TODO: remove these contexts when it has its own interface
|
||||
public static final ScriptContext<Factory> AGGS_CONTEXT = new ScriptContext<>("aggs", Factory.class);
|
||||
// Can return a double. (For ScriptSortType#NUMBER only, for ScriptSortType#STRING normal CONTEXT should be used)
|
||||
public static final ScriptContext<Factory> SCRIPT_SORT_CONTEXT = new ScriptContext<>("sort", Factory.class);
|
||||
// Can return a float
|
||||
public static final ScriptContext<Factory> SCRIPT_SCORE_CONTEXT = new ScriptContext<>("score", Factory.class);
|
||||
// Can return a long
|
||||
public static final ScriptContext<Factory> TERMS_SET_QUERY_CONTEXT = new ScriptContext<>("terms_set", Factory.class);
|
||||
}
|
|
@ -305,7 +305,7 @@ public class ScriptSortBuilder extends SortBuilder<ScriptSortBuilder> {
|
|||
|
||||
@Override
|
||||
public SortFieldAndFormat build(QueryShardContext context) throws IOException {
|
||||
final SearchScript.Factory factory = context.getScriptService().compile(script, SearchScript.CONTEXT);
|
||||
final SearchScript.Factory factory = context.getScriptService().compile(script, SearchScript.SCRIPT_SORT_CONTEXT);
|
||||
final SearchScript.LeafFactory searchScript = factory.newFactory(script.getParams(), context.lookup());
|
||||
|
||||
MultiValueMode valueMode = null;
|
||||
|
|
|
@ -76,7 +76,7 @@ public class ExplainableScriptIT extends ESIntegTestCase {
|
|||
@Override
|
||||
public <T> T compile(String scriptName, String scriptSource, ScriptContext<T> context, Map<String, String> params) {
|
||||
assert scriptSource.equals("explainable_script");
|
||||
assert context == SearchScript.CONTEXT;
|
||||
assert context == SearchScript.SCRIPT_SCORE_CONTEXT;
|
||||
SearchScript.Factory factory = (p, lookup) -> new SearchScript.LeafFactory() {
|
||||
@Override
|
||||
public SearchScript newInstance(LeafReaderContext context) throws IOException {
|
||||
|
|
Loading…
Reference in New Issue