Skip to content

Commit 56cef20

Browse files
Adding settings for query time inference config and applying during semantic query build
1 parent 8c06acc commit 56cef20

File tree

3 files changed

+45
-3
lines changed

3 files changed

+45
-3
lines changed

server/src/main/java/org/elasticsearch/index/mapper/InferenceMetadataFieldsMapper.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@
1515
import org.elasticsearch.cluster.metadata.IndexMetadata;
1616
import org.elasticsearch.common.settings.Setting;
1717
import org.elasticsearch.common.settings.Settings;
18+
import org.elasticsearch.core.TimeValue;
1819
import org.elasticsearch.index.IndexVersion;
1920
import org.elasticsearch.index.IndexVersions;
2021
import org.elasticsearch.index.query.SearchExecutionContext;
2122

2223
import java.util.Map;
24+
import java.util.concurrent.TimeUnit;
2325
import java.util.function.Function;
2426

2527
/**
@@ -28,6 +30,7 @@
2830
* the field name for removal from _source.
2931
*/
3032
public abstract class InferenceMetadataFieldsMapper extends MetadataFieldMapper {
33+
public static final TimeValue DEFAULT_SEMANTIC_TEXT_INFERENCE_TIMEOUT = TimeValue.timeValueSeconds(TimeUnit.SECONDS.toSeconds(10));
3134
/**
3235
* Internal index setting to control the format used for semantic text fields.
3336
* Determines whether to use the legacy format (default: true).
@@ -41,6 +44,12 @@ public abstract class InferenceMetadataFieldsMapper extends MetadataFieldMapper
4144
Setting.Property.IndexScope,
4245
Setting.Property.InternalIndex
4346
);
47+
public static final Setting<TimeValue> SEMANTIC_TEXT_INFERENCE_TIMEOUT = Setting.timeSetting(
48+
"index.semantic_text.inference_timeout",
49+
DEFAULT_SEMANTIC_TEXT_INFERENCE_TIMEOUT,
50+
Setting.Property.IndexScope,
51+
Setting.Property.Dynamic
52+
);
4453

4554
// Check index version SOURCE_MAPPER_MODE_ATTRIBUTE_NOOP because that index version was added in the same serverless promotion
4655
// where the new format was enabled by default

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.elasticsearch.core.IOUtils;
2626
import org.elasticsearch.core.TimeValue;
2727
import org.elasticsearch.features.NodeFeature;
28+
import org.elasticsearch.index.mapper.InferenceMetadataFieldsMapper;
2829
import org.elasticsearch.index.mapper.Mapper;
2930
import org.elasticsearch.index.mapper.MetadataFieldMapper;
3031
import org.elasticsearch.indices.SystemIndexDescriptor;
@@ -495,7 +496,7 @@ public List<Setting<?>> getSettings() {
495496
settings.add(SKIP_VALIDATE_AND_START);
496497
settings.add(INDICES_INFERENCE_BATCH_SIZE);
497498
settings.addAll(ElasticInferenceServiceSettings.getSettingsDefinitions());
498-
499+
settings.add(InferenceMetadataFieldsMapper.SEMANTIC_TEXT_INFERENCE_TIMEOUT);
499500
return settings;
500501
}
501502

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/queries/SemanticQueryBuilder.java

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import org.elasticsearch.cluster.metadata.InferenceFieldMetadata;
1717
import org.elasticsearch.common.io.stream.StreamInput;
1818
import org.elasticsearch.common.io.stream.StreamOutput;
19+
import org.elasticsearch.core.TimeValue;
20+
import org.elasticsearch.index.mapper.InferenceMetadataFieldsMapper;
1921
import org.elasticsearch.index.mapper.MappedFieldType;
2022
import org.elasticsearch.index.query.AbstractQueryBuilder;
2123
import org.elasticsearch.index.query.MatchNoneQueryBuilder;
@@ -31,7 +33,6 @@
3133
import org.elasticsearch.xcontent.XContentBuilder;
3234
import org.elasticsearch.xcontent.XContentParser;
3335
import org.elasticsearch.xpack.core.inference.action.InferenceAction;
34-
import org.elasticsearch.xpack.core.ml.action.InferModelAction;
3536
import org.elasticsearch.xpack.core.ml.inference.results.ErrorInferenceResults;
3637
import org.elasticsearch.xpack.core.ml.inference.results.MlTextEmbeddingResults;
3738
import org.elasticsearch.xpack.core.ml.inference.results.TextExpansionResults;
@@ -225,6 +226,10 @@ private SemanticQueryBuilder doRewriteGetInferenceResults(QueryRewriteContext qu
225226
}
226227

227228
String inferenceId = getInferenceIdForForField(resolvedIndices.getConcreteLocalIndicesMetadata().values(), fieldName);
229+
TimeValue inferenceTimeout = getInferenceTimeeoutForSemanticField(
230+
resolvedIndices.getConcreteLocalIndicesMetadata().values(),
231+
fieldName
232+
);
228233
SetOnce<InferenceServiceResults> inferenceResultsSupplier = new SetOnce<>();
229234
boolean noInferenceResults = false;
230235
if (inferenceId != null) {
@@ -237,7 +242,7 @@ private SemanticQueryBuilder doRewriteGetInferenceResults(QueryRewriteContext qu
237242
List.of(query),
238243
Map.of(),
239244
InputType.INTERNAL_SEARCH,
240-
InferModelAction.Request.DEFAULT_TIMEOUT_FOR_API,
245+
inferenceTimeout,
241246
false
242247
);
243248

@@ -264,6 +269,33 @@ private SemanticQueryBuilder doRewriteGetInferenceResults(QueryRewriteContext qu
264269
return new SemanticQueryBuilder(this, noInferenceResults ? null : inferenceResultsSupplier, null, noInferenceResults);
265270
}
266271

272+
@SuppressWarnings("unchecked")
273+
private TimeValue getInferenceTimeeoutForSemanticField(Collection<IndexMetadata> indexMetadataCollection, String fieldName) {
274+
TimeValue inferenceTimeout = InferenceMetadataFieldsMapper.DEFAULT_SEMANTIC_TEXT_INFERENCE_TIMEOUT;
275+
for (IndexMetadata indexMetadata : indexMetadataCollection) {
276+
boolean fieldExistsInIndex = indexMetadata.mapping()
277+
.getSourceAsMap()
278+
.values()
279+
.stream()
280+
.filter(v -> v instanceof Map)
281+
.map(v -> (Map<String, Object>) v)
282+
.anyMatch(m -> m.containsKey(fieldName));
283+
284+
if (fieldExistsInIndex == false) {
285+
continue;
286+
}
287+
288+
TimeValue currentInferenceTimeout = indexMetadata.getSettings()
289+
.getAsTime("index.semantic_text.inference_timeout", InferenceMetadataFieldsMapper.DEFAULT_SEMANTIC_TEXT_INFERENCE_TIMEOUT);
290+
291+
if (currentInferenceTimeout.compareTo(inferenceTimeout) < 0) {
292+
inferenceTimeout = currentInferenceTimeout;
293+
}
294+
}
295+
296+
return inferenceTimeout;
297+
}
298+
267299
private static InferenceResults validateAndConvertInferenceResults(
268300
SetOnce<InferenceServiceResults> inferenceResultsSupplier,
269301
String fieldName

0 commit comments

Comments
 (0)