Skip to content

Commit 83ec2b3

Browse files
committed
Add settings for completion and rerank ES|QL commands.
1 parent 2ae7352 commit 83ec2b3

File tree

9 files changed

+101
-16
lines changed

9 files changed

+101
-16
lines changed

x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/EsqlTestUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,7 @@ public static LogicalOptimizerContext unboundLogicalOptimizerContext() {
565565
mock(ProjectResolver.class),
566566
mock(IndexNameExpressionResolver.class),
567567
null,
568-
new InferenceService(mock(Client.class)),
568+
new InferenceService(mock(Client.class), Settings.EMPTY),
569569
new BlockFactoryProvider(PlannerUtils.NON_BREAKING_BLOCK_FACTORY),
570570
TEST_PLANNER_SETTINGS,
571571
new CrossProjectModeDecider(Settings.EMPTY)

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/inference/InferenceService.java

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,15 @@
88
package org.elasticsearch.xpack.esql.inference;
99

1010
import org.elasticsearch.client.internal.Client;
11+
import org.elasticsearch.common.settings.Settings;
1112
import org.elasticsearch.xpack.esql.expression.function.EsqlFunctionRegistry;
1213
import org.elasticsearch.xpack.esql.inference.bulk.BulkInferenceRunner;
1314
import org.elasticsearch.xpack.esql.inference.bulk.BulkInferenceRunnerConfig;
1415

1516
public class InferenceService {
17+
18+
private final InferenceSettings inferenceSettings;
19+
1620
private final InferenceResolver.Factory inferenceResolverFactory;
1721

1822
private final BulkInferenceRunner.Factory bulkInferenceRunnerFactory;
@@ -21,14 +25,29 @@ public class InferenceService {
2125
* Creates a new inference service with the given client.
2226
*
2327
* @param client the Elasticsearch client for inference operations
28+
* @param settings the node settings
2429
*/
25-
public InferenceService(Client client) {
26-
this(InferenceResolver.factory(client), BulkInferenceRunner.factory(client));
30+
public InferenceService(Client client, Settings settings) {
31+
this(InferenceResolver.factory(client), BulkInferenceRunner.factory(client), new InferenceSettings(settings));
2732
}
2833

29-
private InferenceService(InferenceResolver.Factory inferenceResolverFactory, BulkInferenceRunner.Factory bulkInferenceRunnerFactory) {
34+
private InferenceService(
35+
InferenceResolver.Factory inferenceResolverFactory,
36+
BulkInferenceRunner.Factory bulkInferenceRunnerFactory,
37+
InferenceSettings inferenceSettings
38+
) {
3039
this.inferenceResolverFactory = inferenceResolverFactory;
3140
this.bulkInferenceRunnerFactory = bulkInferenceRunnerFactory;
41+
this.inferenceSettings = inferenceSettings;
42+
}
43+
44+
/**
45+
* Returns the settings for ES|QL inference features.
46+
*
47+
* @return the inference settings
48+
*/
49+
public InferenceSettings inferenceSettings() {
50+
return inferenceSettings;
3251
}
3352

3453
/**
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0; you may not use this file except in compliance with the Elastic License
5+
* 2.0.
6+
*/
7+
8+
package org.elasticsearch.xpack.esql.inference;
9+
10+
import org.elasticsearch.common.settings.Setting;
11+
import org.elasticsearch.common.settings.Settings;
12+
13+
/**
14+
* Settings for inference features such as completion and rerank.
15+
*/
16+
public record InferenceSettings(boolean completionEnabled, int completionMaxSize, boolean rerankEnabled, int rerankMaxSize) {
17+
18+
public static final Setting<Boolean> COMPLETION_ENABLED_SETTING = Setting.boolSetting(
19+
"esql.command.completion.enabled",
20+
true,
21+
Setting.Property.Dynamic,
22+
Setting.Property.NodeScope
23+
);
24+
25+
public static final Setting<Integer> COMPLETION_ROW_LIMIT_SETTING = Setting.intSetting(
26+
"esql.command.completion.limit",
27+
100,
28+
1,
29+
Setting.Property.Dynamic,
30+
Setting.Property.NodeScope
31+
);
32+
33+
public static final Setting<Boolean> RERANK_ENABLED_SETTING = Setting.boolSetting(
34+
"esql.command.rerank.enabled",
35+
true,
36+
Setting.Property.Dynamic,
37+
Setting.Property.NodeScope
38+
);
39+
40+
public static final Setting<Integer> RERANK_ROW_LIMIT_SETTING = Setting.intSetting(
41+
"esql.command.rerank.limit",
42+
1000,
43+
1,
44+
Setting.Property.Dynamic,
45+
Setting.Property.NodeScope
46+
);
47+
48+
public InferenceSettings(Settings settings) {
49+
this(
50+
COMPLETION_ENABLED_SETTING.get(settings),
51+
COMPLETION_ROW_LIMIT_SETTING.get(settings),
52+
RERANK_ENABLED_SETTING.get(settings),
53+
RERANK_ROW_LIMIT_SETTING.get(settings)
54+
);
55+
}
56+
}

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlParser.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@
1616
import org.antlr.v4.runtime.TokenSource;
1717
import org.antlr.v4.runtime.VocabularyImpl;
1818
import org.antlr.v4.runtime.atn.PredictionMode;
19+
import org.elasticsearch.common.settings.Settings;
1920
import org.elasticsearch.logging.LogManager;
2021
import org.elasticsearch.logging.Logger;
2122
import org.elasticsearch.xpack.esql.core.util.StringUtils;
2223
import org.elasticsearch.xpack.esql.expression.function.EsqlFunctionRegistry;
24+
import org.elasticsearch.xpack.esql.inference.InferenceSettings;
2325
import org.elasticsearch.xpack.esql.plan.EsqlStatement;
2426
import org.elasticsearch.xpack.esql.plan.logical.LogicalPlan;
2527
import org.elasticsearch.xpack.esql.telemetry.PlanTelemetry;
@@ -105,14 +107,14 @@ public LogicalPlan createStatement(String query) {
105107

106108
// testing utility
107109
public LogicalPlan createStatement(String query, QueryParams params) {
108-
return createStatement(query, params, new PlanTelemetry(new EsqlFunctionRegistry()));
110+
return createStatement(query, params, new PlanTelemetry(new EsqlFunctionRegistry()), new InferenceSettings(Settings.EMPTY));
109111
}
110112

111-
public LogicalPlan createStatement(String query, QueryParams params, PlanTelemetry metrics) {
113+
public LogicalPlan createStatement(String query, QueryParams params, PlanTelemetry metrics, InferenceSettings inferenceSettings) {
112114
if (log.isDebugEnabled()) {
113115
log.debug("Parsing as statement: {}", query);
114116
}
115-
return invokeParser(query, params, metrics, EsqlBaseParser::singleStatement, AstBuilder::plan);
117+
return invokeParser(query, params, metrics, inferenceSettings, EsqlBaseParser::singleStatement, AstBuilder::plan);
116118
}
117119

118120
// testing utility
@@ -122,20 +124,21 @@ public EsqlStatement createQuery(String query) {
122124

123125
// testing utility
124126
public EsqlStatement createQuery(String query, QueryParams params) {
125-
return createQuery(query, params, new PlanTelemetry(new EsqlFunctionRegistry()));
127+
return createQuery(query, params, new PlanTelemetry(new EsqlFunctionRegistry()), new InferenceSettings(Settings.EMPTY));
126128
}
127129

128-
public EsqlStatement createQuery(String query, QueryParams params, PlanTelemetry metrics) {
130+
public EsqlStatement createQuery(String query, QueryParams params, PlanTelemetry metrics, InferenceSettings inferenceSettings) {
129131
if (log.isDebugEnabled()) {
130132
log.debug("Parsing as statement: {}", query);
131133
}
132-
return invokeParser(query, params, metrics, EsqlBaseParser::statements, AstBuilder::statement);
134+
return invokeParser(query, params, metrics, inferenceSettings, EsqlBaseParser::statements, AstBuilder::statement);
133135
}
134136

135137
private <T> T invokeParser(
136138
String query,
137139
QueryParams params,
138140
PlanTelemetry metrics,
141+
InferenceSettings inferenceSettings,
139142
Function<EsqlBaseParser, ParserRuleContext> parseFunction,
140143
BiFunction<AstBuilder, ParserRuleContext, T> result
141144
) {
@@ -169,7 +172,7 @@ private <T> T invokeParser(
169172
log.trace("Parse tree: {}", tree.toStringTree());
170173
}
171174

172-
return result.apply(new AstBuilder(new ExpressionBuilder.ParsingContext(params, metrics)), tree);
175+
return result.apply(new AstBuilder(new ExpressionBuilder.ParsingContext(params, metrics, inferenceSettings)), tree);
173176
} catch (StackOverflowError e) {
174177
throw new ParsingException("ESQL statement is too large, causing stack overflow when generating the parsing tree: [{}]", query);
175178
// likely thrown by an invalid popMode (such as extra closing parenthesis)

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/ExpressionBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
import org.elasticsearch.xpack.esql.expression.predicate.operator.comparison.InsensitiveEquals;
6868
import org.elasticsearch.xpack.esql.expression.predicate.operator.comparison.LessThan;
6969
import org.elasticsearch.xpack.esql.expression.predicate.operator.comparison.LessThanOrEqual;
70+
import org.elasticsearch.xpack.esql.inference.InferenceSettings;
7071
import org.elasticsearch.xpack.esql.telemetry.PlanTelemetry;
7172
import org.elasticsearch.xpack.esql.type.EsqlDataTypeConverter;
7273

@@ -124,7 +125,7 @@ public abstract class ExpressionBuilder extends IdentifierBuilder {
124125

125126
protected final ParsingContext context;
126127

127-
public record ParsingContext(QueryParams params, PlanTelemetry telemetry) {}
128+
public record ParsingContext(QueryParams params, PlanTelemetry telemetry, InferenceSettings inferenceSettings) {}
128129

129130
ExpressionBuilder(ParsingContext context) {
130131
this.context = context;

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/EsqlPlugin.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
import org.elasticsearch.xpack.esql.enrich.LookupFromIndexOperator;
7474
import org.elasticsearch.xpack.esql.execution.PlanExecutor;
7575
import org.elasticsearch.xpack.esql.expression.ExpressionWritables;
76+
import org.elasticsearch.xpack.esql.inference.InferenceSettings;
7677
import org.elasticsearch.xpack.esql.io.stream.ExpressionQueryBuilder;
7778
import org.elasticsearch.xpack.esql.io.stream.PlanStreamWrapperQueryBuilder;
7879
import org.elasticsearch.xpack.esql.plan.PlanWritables;
@@ -236,7 +237,11 @@ public List<Setting<?>> getSettings() {
236237
PlannerSettings.REDUCTION_LATE_MATERIALIZATION,
237238
STORED_FIELDS_SEQUENTIAL_PROPORTION,
238239
EsqlFlags.ESQL_STRING_LIKE_ON_INDEX,
239-
EsqlFlags.ESQL_ROUNDTO_PUSHDOWN_THRESHOLD
240+
EsqlFlags.ESQL_ROUNDTO_PUSHDOWN_THRESHOLD,
241+
InferenceSettings.COMPLETION_ENABLED_SETTING,
242+
InferenceSettings.COMPLETION_ROW_LIMIT_SETTING,
243+
InferenceSettings.RERANK_ENABLED_SETTING,
244+
InferenceSettings.RERANK_ROW_LIMIT_SETTING
240245
);
241246
}
242247

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/TransportEsqlQueryAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ public TransportEsqlQueryAction(
171171
projectResolver,
172172
indexNameExpressionResolver,
173173
usageService,
174-
new InferenceService(client),
174+
new InferenceService(client, clusterService.getSettings()),
175175
blockFactoryProvider,
176176
new PlannerSettings(clusterService),
177177
new CrossProjectModeDecider(clusterService.getSettings())

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlSession.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ private static void releaseLocalRelationBlocks(AtomicReference<Page> localRelati
473473
}
474474

475475
private EsqlStatement parse(String query, QueryParams params) {
476-
var parsed = new EsqlParser().createQuery(query, params, planTelemetry);
476+
var parsed = new EsqlParser().createQuery(query, params, planTelemetry, inferenceService.inferenceSettings());
477477
if (LOGGER.isDebugEnabled()) {
478478
LOGGER.debug("Parsed logical plan:\n{}", parsed.plan());
479479
LOGGER.debug("Parsed settings:\n[{}]", parsed.settings().stream().map(QuerySetting::toString).collect(joining("; ")));

x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/inference/InferenceOperatorTestCase.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.elasticsearch.action.ActionType;
1515
import org.elasticsearch.client.internal.Client;
1616
import org.elasticsearch.common.logging.LoggerMessageFormat;
17+
import org.elasticsearch.common.settings.Settings;
1718
import org.elasticsearch.compute.data.Block;
1819
import org.elasticsearch.compute.data.BlockFactory;
1920
import org.elasticsearch.compute.data.BooleanBlock;
@@ -140,7 +141,7 @@ private void runWithRandomDelay(Runnable runnable) {
140141
}
141142
};
142143

143-
return new InferenceService(mockClient);
144+
return new InferenceService(mockClient, Settings.EMPTY);
144145
}
145146

146147
protected abstract InferenceResultsType mockInferenceResult(InferenceAction.Request request);

0 commit comments

Comments
 (0)