Skip to content

Commit f6e4ff2

Browse files
Merge branch 'main' into revert-role-mapping-changes
2 parents 745861d + 3a83fcd commit f6e4ff2

File tree

13 files changed

+237
-64
lines changed

13 files changed

+237
-64
lines changed

docs/changelog/113563.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 113563
2+
summary: Use ELSER By Default For Semantic Text
3+
area: Mapping
4+
type: enhancement
5+
issues: []

muted-tests.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,12 @@ tests:
379379
- class: org.elasticsearch.backwards.MixedClusterClientYamlTestSuiteIT
380380
method: test {p0=aggregations/stats_metric_fail_formatting/fail formatting}
381381
issue: https://github.com/elastic/elasticsearch/issues/114320
382+
- class: org.elasticsearch.xpack.inference.services.cohere.CohereServiceTests
383+
method: testInfer_StreamRequest_ErrorResponse
384+
issue: https://github.com/elastic/elasticsearch/issues/114327
385+
- class: org.elasticsearch.xpack.rank.rrf.RRFRankClientYamlTestSuiteIT
386+
method: test {yaml=rrf/700_rrf_retriever_search_api_compatibility/rrf retriever with top-level collapse}
387+
issue: https://github.com/elastic/elasticsearch/issues/114331
382388

383389
# Examples:
384390
#

test/test-clusters/src/main/java/org/elasticsearch/test/cluster/FeatureFlag.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ public enum FeatureFlag {
1919
TIME_SERIES_MODE("es.index_mode_feature_flag_registered=true", Version.fromString("8.0.0"), null),
2020
FAILURE_STORE_ENABLED("es.failure_store_feature_flag_enabled=true", Version.fromString("8.12.0"), null),
2121
CHUNKING_SETTINGS_ENABLED("es.inference_chunking_settings_feature_flag_enabled=true", Version.fromString("8.16.0"), null),
22-
INFERENCE_SCALE_TO_ZERO("es.inference_scale_to_zero_feature_flag_enabled=true", Version.fromString("8.16.0"), null),
2322
INFERENCE_DEFAULT_ELSER("es.inference_default_elser_feature_flag_enabled=true", Version.fromString("8.16.0"), null);
2423

2524
public final String systemProperty;

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

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.elasticsearch.xpack.inference.rank.random.RandomRankRetrieverBuilder;
1515
import org.elasticsearch.xpack.inference.rank.textsimilarity.TextSimilarityRankRetrieverBuilder;
1616

17+
import java.util.HashSet;
1718
import java.util.Set;
1819

1920
/**
@@ -23,13 +24,16 @@ public class InferenceFeatures implements FeatureSpecification {
2324

2425
@Override
2526
public Set<NodeFeature> getFeatures() {
26-
return Set.of(
27-
TextSimilarityRankRetrieverBuilder.TEXT_SIMILARITY_RERANKER_RETRIEVER_SUPPORTED,
28-
RandomRankRetrieverBuilder.RANDOM_RERANKER_RETRIEVER_SUPPORTED,
29-
SemanticTextFieldMapper.SEMANTIC_TEXT_SEARCH_INFERENCE_ID,
30-
SemanticQueryBuilder.SEMANTIC_TEXT_INNER_HITS,
31-
TextSimilarityRankRetrieverBuilder.TEXT_SIMILARITY_RERANKER_COMPOSITION_SUPPORTED
32-
);
27+
var features = new HashSet<NodeFeature>();
28+
features.add(TextSimilarityRankRetrieverBuilder.TEXT_SIMILARITY_RERANKER_RETRIEVER_SUPPORTED);
29+
features.add(RandomRankRetrieverBuilder.RANDOM_RERANKER_RETRIEVER_SUPPORTED);
30+
features.add(SemanticTextFieldMapper.SEMANTIC_TEXT_SEARCH_INFERENCE_ID);
31+
features.add(SemanticQueryBuilder.SEMANTIC_TEXT_INNER_HITS);
32+
features.add(TextSimilarityRankRetrieverBuilder.TEXT_SIMILARITY_RERANKER_COMPOSITION_SUPPORTED);
33+
if (DefaultElserFeatureFlag.isEnabled()) {
34+
features.add(SemanticTextFieldMapper.SEMANTIC_TEXT_DEFAULT_ELSER_2);
35+
}
36+
return Set.copyOf(features);
3337
}
3438

3539
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public record SemanticTextField(String fieldName, List<String> originalValues, I
5858
static final String TEXT_FIELD = "text";
5959
static final String INFERENCE_FIELD = "inference";
6060
static final String INFERENCE_ID_FIELD = "inference_id";
61+
static final String SEARCH_INFERENCE_ID_FIELD = "search_inference_id";
6162
static final String CHUNKS_FIELD = "chunks";
6263
static final String CHUNKED_EMBEDDINGS_FIELD = "embeddings";
6364
static final String CHUNKED_TEXT_FIELD = "text";

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

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import org.elasticsearch.xcontent.XContentParserConfiguration;
5555
import org.elasticsearch.xpack.core.ml.inference.results.MlTextEmbeddingResults;
5656
import org.elasticsearch.xpack.core.ml.inference.results.TextExpansionResults;
57+
import org.elasticsearch.xpack.inference.DefaultElserFeatureFlag;
5758

5859
import java.io.IOException;
5960
import java.util.ArrayList;
@@ -71,18 +72,23 @@
7172
import static org.elasticsearch.xpack.inference.mapper.SemanticTextField.CHUNKS_FIELD;
7273
import static org.elasticsearch.xpack.inference.mapper.SemanticTextField.INFERENCE_FIELD;
7374
import static org.elasticsearch.xpack.inference.mapper.SemanticTextField.INFERENCE_ID_FIELD;
75+
import static org.elasticsearch.xpack.inference.mapper.SemanticTextField.MODEL_SETTINGS_FIELD;
76+
import static org.elasticsearch.xpack.inference.mapper.SemanticTextField.SEARCH_INFERENCE_ID_FIELD;
7477
import static org.elasticsearch.xpack.inference.mapper.SemanticTextField.TEXT_FIELD;
7578
import static org.elasticsearch.xpack.inference.mapper.SemanticTextField.getChunksFieldName;
7679
import static org.elasticsearch.xpack.inference.mapper.SemanticTextField.getEmbeddingsFieldName;
7780
import static org.elasticsearch.xpack.inference.mapper.SemanticTextField.getOriginalTextFieldName;
81+
import static org.elasticsearch.xpack.inference.services.elasticsearch.ElasticsearchInternalService.DEFAULT_ELSER_ID;
7882

7983
/**
8084
* A {@link FieldMapper} for semantic text fields.
8185
*/
8286
public class SemanticTextFieldMapper extends FieldMapper implements InferenceFieldMapper {
8387
public static final NodeFeature SEMANTIC_TEXT_SEARCH_INFERENCE_ID = new NodeFeature("semantic_text.search_inference_id");
88+
public static final NodeFeature SEMANTIC_TEXT_DEFAULT_ELSER_2 = new NodeFeature("semantic_text.default_elser_2");
8489

8590
public static final String CONTENT_TYPE = "semantic_text";
91+
public static final String DEFAULT_ELSER_2_INFERENCE_ID = DEFAULT_ELSER_ID;
8692

8793
private final IndexSettings indexSettings;
8894

@@ -96,25 +102,37 @@ public static class Builder extends FieldMapper.Builder {
96102
private final IndexSettings indexSettings;
97103

98104
private final Parameter<String> inferenceId = Parameter.stringParam(
99-
"inference_id",
105+
INFERENCE_ID_FIELD,
100106
false,
101107
mapper -> ((SemanticTextFieldType) mapper.fieldType()).inferenceId,
102-
null
108+
DefaultElserFeatureFlag.isEnabled() ? DEFAULT_ELSER_2_INFERENCE_ID : null
103109
).addValidator(v -> {
104110
if (Strings.isEmpty(v)) {
105-
throw new IllegalArgumentException("field [inference_id] must be specified");
111+
// If the default ELSER feature flag is enabled, the only way we get here is if the user explicitly sets the param to an
112+
// empty value. However, if the feature flag is disabled, we can get here if the user didn't set the param.
113+
// Adjust the error message appropriately.
114+
String message = DefaultElserFeatureFlag.isEnabled()
115+
? "[" + INFERENCE_ID_FIELD + "] on mapper [" + leafName() + "] of type [" + CONTENT_TYPE + "] must not be empty"
116+
: "[" + INFERENCE_ID_FIELD + "] on mapper [" + leafName() + "] of type [" + CONTENT_TYPE + "] must be specified";
117+
throw new IllegalArgumentException(message);
106118
}
107119
});
108120

109121
private final Parameter<String> searchInferenceId = Parameter.stringParam(
110-
"search_inference_id",
122+
SEARCH_INFERENCE_ID_FIELD,
111123
true,
112124
mapper -> ((SemanticTextFieldType) mapper.fieldType()).searchInferenceId,
113125
null
114-
).acceptsNull();
126+
).acceptsNull().addValidator(v -> {
127+
if (v != null && Strings.isEmpty(v)) {
128+
throw new IllegalArgumentException(
129+
"[" + SEARCH_INFERENCE_ID_FIELD + "] on mapper [" + leafName() + "] of type [" + CONTENT_TYPE + "] must not be empty"
130+
);
131+
}
132+
});
115133

116134
private final Parameter<SemanticTextField.ModelSettings> modelSettings = new Parameter<>(
117-
"model_settings",
135+
MODEL_SETTINGS_FIELD,
118136
true,
119137
() -> null,
120138
(n, c, o) -> SemanticTextField.parseModelSettingsFromMap(o),
@@ -204,6 +222,7 @@ public SemanticTextFieldMapper build(MapperBuilderContext context) {
204222
}
205223
var childContext = context.createChildContext(leafName(), ObjectMapper.Dynamic.FALSE);
206224
final ObjectMapper inferenceField = inferenceFieldBuilder.apply(childContext);
225+
207226
return new SemanticTextFieldMapper(
208227
leafName(),
209228
new SemanticTextFieldType(

0 commit comments

Comments
 (0)