Skip to content

Commit 1092c47

Browse files
Use ELSER By Default For Semantic Text (#113563) (#114346)
Co-authored-by: David Kyle <[email protected]> (cherry picked from commit 0cc0544) # Conflicts: # x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/InferenceFeatures.java Co-authored-by: Elastic Machine <[email protected]>
1 parent b6047b2 commit 1092c47

File tree

7 files changed

+228
-34
lines changed

7 files changed

+228
-34
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: []

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

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

16+
import java.util.HashSet;
1617
import java.util.Set;
1718

1819
/**
@@ -22,12 +23,15 @@ public class InferenceFeatures implements FeatureSpecification {
2223

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

3337
}

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)