Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
4e4fae2
fix(semantic_text): index underlying dense_vector field in older indices
mromaios Aug 18, 2025
e63a078
Update docs/changelog/133080.yaml
mromaios Aug 18, 2025
a8fd795
[CI] Auto commit changes from spotless
Aug 18, 2025
a6eb387
update msg, change versions, add ut
mromaios Aug 19, 2025
fe8e551
Merge branch '132551_enable_dense_vector_indexing' of github.com:mrom…
mromaios Aug 19, 2025
587726c
indent
mromaios Aug 19, 2025
46d0f47
remove todo
mromaios Aug 19, 2025
db05915
[CI] Auto commit changes from spotless
Aug 19, 2025
13c713c
Merge branch '132551_enable_dense_vector_indexing' of github.com:mrom…
mromaios Aug 19, 2025
d8b18ac
update msg
mromaios Aug 19, 2025
42fa220
[CI] Auto commit changes from spotless
Aug 19, 2025
c2cef25
Merge branch '132551_enable_dense_vector_indexing' of github.com:mrom…
mromaios Aug 19, 2025
d572fd7
add densevectormapper indexed ut
mromaios Aug 19, 2025
9c48f54
[CI] Auto commit changes from spotless
Aug 19, 2025
ffa865c
Merge branch '132551_enable_dense_vector_indexing' of github.com:mrom…
mromaios Aug 19, 2025
7fa6386
fix ut
mromaios Aug 19, 2025
f0ab1e1
undo accidental ut removal
mromaios Aug 19, 2025
d5219ed
[CI] Auto commit changes from spotless
Aug 19, 2025
9c657b8
Merge branch 'main' into 132551_enable_dense_vector_indexing
mromaios Aug 20, 2025
e463327
Merge branch 'main' into 132551_enable_dense_vector_indexing
mromaios Aug 20, 2025
552a161
Merge branch 'main' into 132551_enable_dense_vector_indexing
mromaios Aug 20, 2025
0d00ec5
Update docs/changelog/133080.yaml
mromaios Aug 20, 2025
0eeee59
remove sparse_vector exception change
mromaios Aug 21, 2025
02d1eab
[CI] Auto commit changes from spotless
Aug 21, 2025
99bbd07
reverting most of the stuff
mromaios Aug 21, 2025
b846747
Merge branch '132551_enable_dense_vector_indexing' of github.com:mrom…
mromaios Aug 21, 2025
001c491
removing unused import, rename test
mromaios Aug 21, 2025
db153f5
[CI] Auto commit changes from spotless
Aug 21, 2025
3d242f7
Merge branch '132551_enable_dense_vector_indexing' of github.com:mrom…
mromaios Aug 21, 2025
f5944c6
syntax
mromaios Aug 21, 2025
6bd255a
revisit changelog
mromaios Aug 21, 2025
171a7de
revisit changelog
mromaios Aug 21, 2025
6ef1540
Update docs/changelog/133080.yaml
mromaios Aug 22, 2025
4267858
Update x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/…
mromaios Aug 22, 2025
3fa3a0d
Merge branch '132551_enable_dense_vector_indexing' of github.com:mrom…
mromaios Aug 22, 2025
bb815c1
changelog format
mromaios Aug 22, 2025
ab04a91
Merge branch 'main' into 132551_enable_dense_vector_indexing
mromaios Aug 22, 2025
2e262b3
Merge branch '132551_enable_dense_vector_indexing' of github.com:mrom…
mromaios Aug 22, 2025
166964f
fix UT
mromaios Aug 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions docs/changelog/133080.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
pr: 133080
summary: "Disallow creating `semantic_text` fields in indices created prior to 8.11.0"
area: Relevance
type: bug
issues: []
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
import static org.apache.lucene.tests.index.BaseKnnVectorsFormatTestCase.randomNormalizedVector;
import static org.elasticsearch.index.codec.vectors.IVFVectorsFormat.DYNAMIC_VISIT_RATIO;
import static org.elasticsearch.index.mapper.vectors.DenseVectorFieldMapper.DEFAULT_OVERSAMPLE;
import static org.elasticsearch.index.mapper.vectors.DenseVectorFieldMapper.INDEXED_BY_DEFAULT_INDEX_VERSION;
import static org.elasticsearch.index.mapper.vectors.DenseVectorFieldMapper.IVF_FORMAT;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo;
Expand Down Expand Up @@ -106,7 +107,7 @@ private void indexMapping(XContentBuilder b, IndexVersion indexVersion) throws I
if (elementType != ElementType.FLOAT) {
b.field("element_type", elementType.toString());
}
if (indexVersion.onOrAfter(DenseVectorFieldMapper.INDEXED_BY_DEFAULT_INDEX_VERSION) || indexed) {
if (indexVersion.onOrAfter(INDEXED_BY_DEFAULT_INDEX_VERSION) || indexed) {
// Serialize if it's new index version, or it was not the default for previous indices
b.field("index", indexed);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@
import java.util.function.Function;
import java.util.function.Supplier;

import static org.elasticsearch.index.IndexVersions.NEW_SPARSE_VECTOR;
import static org.elasticsearch.index.IndexVersions.SEMANTIC_TEXT_DEFAULTS_TO_BBQ;
import static org.elasticsearch.index.IndexVersions.SEMANTIC_TEXT_DEFAULTS_TO_BBQ_BACKPORT_8_X;
import static org.elasticsearch.inference.TaskType.SPARSE_EMBEDDING;
Expand All @@ -127,6 +128,7 @@
*/
public class SemanticTextFieldMapper extends FieldMapper implements InferenceFieldMapper {
private static final Logger logger = LogManager.getLogger(SemanticTextFieldMapper.class);
public static final String UNSUPPORTED_INDEX_MESSAGE = "[semantic_text] is available on indices created with 8.11 or higher.";
public static final NodeFeature SEMANTIC_TEXT_IN_OBJECT_FIELD_FIX = new NodeFeature("semantic_text.in_object_field_fix");
public static final NodeFeature SEMANTIC_TEXT_SINGLE_FIELD_UPDATE_FIX = new NodeFeature("semantic_text.single_field_update_fix");
public static final NodeFeature SEMANTIC_TEXT_DELETE_FIX = new NodeFeature("semantic_text.delete_fix");
Expand Down Expand Up @@ -165,6 +167,9 @@ public static final TypeParser parser(Supplier<ModelRegistry> modelRegistry) {

public static BiConsumer<String, MappingParserContext> validateParserContext(String type) {
return (n, c) -> {
if (c.getIndexSettings().getIndexVersionCreated().before(NEW_SPARSE_VECTOR)) {
throw new UnsupportedOperationException(UNSUPPORTED_INDEX_MESSAGE);
}
if (InferenceMetadataFieldsMapper.isEnabled(c.getIndexSettings().getSettings()) == false) {
notInMultiFields(type).accept(n, c);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@
import static org.elasticsearch.xpack.inference.mapper.SemanticTextFieldMapper.DEFAULT_ELSER_2_INFERENCE_ID;
import static org.elasticsearch.xpack.inference.mapper.SemanticTextFieldMapper.DEFAULT_RESCORE_OVERSAMPLE;
import static org.elasticsearch.xpack.inference.mapper.SemanticTextFieldMapper.INDEX_OPTIONS_FIELD;
import static org.elasticsearch.xpack.inference.mapper.SemanticTextFieldMapper.UNSUPPORTED_INDEX_MESSAGE;
import static org.elasticsearch.xpack.inference.mapper.SemanticTextFieldTests.generateRandomChunkingSettings;
import static org.elasticsearch.xpack.inference.mapper.SemanticTextFieldTests.generateRandomChunkingSettingsOtherThan;
import static org.elasticsearch.xpack.inference.mapper.SemanticTextFieldTests.randomSemanticText;
Expand Down Expand Up @@ -414,6 +415,57 @@ public void testInvalidTaskTypes() {
}
}

@Override
protected IndexVersion boostNotAllowedIndexVersion() {
return IndexVersions.NEW_SPARSE_VECTOR;
}

public void testOldIndexSemanticTextDenseVectorRaisesError() throws IOException {
final String fieldName = "field";
final XContentBuilder fieldMapping = fieldMapping(b -> {
b.field("type", "semantic_text");
b.field(INFERENCE_ID_FIELD, "test_inference_id");
b.startObject("model_settings");
b.field("task_type", "text_embedding");
b.field("dimensions", 384);
b.field("similarity", "cosine");
b.field("element_type", "float");
b.endObject();
});
assertOldIndexUnsupported(fieldMapping);
}

public void testOldIndexSemanticTextMinimalMappingRaisesError() throws IOException {
final XContentBuilder fieldMapping = fieldMapping(this::minimalMapping);
assertOldIndexUnsupported(fieldMapping);
}

public void testOldIndexSemanticTextSparseVersionRaisesError() throws IOException {
final XContentBuilder fieldMapping = fieldMapping(b -> {
b.field("type", "semantic_text");
b.field("inference_id", "another_inference_id");
b.startObject("model_settings");
b.field("task_type", "sparse_embedding");
b.endObject();
});
assertOldIndexUnsupported(fieldMapping);
}

private void assertOldIndexUnsupported(XContentBuilder fieldMapping) {

MapperParsingException exception = assertThrows(
MapperParsingException.class,
() -> createMapperService(
fieldMapping,
true,
IndexVersions.V_8_0_0,
IndexVersionUtils.getPreviousVersion(IndexVersions.NEW_SPARSE_VECTOR)
)
);
assertTrue(exception.getMessage().contains(UNSUPPORTED_INDEX_MESSAGE));
assertTrue(exception.getRootCause() instanceof UnsupportedOperationException);
}

public void testMultiFieldsSupport() throws IOException {
if (useLegacyFormat) {
Exception e = expectThrows(MapperParsingException.class, () -> createMapperService(fieldMapping(b -> {
Expand Down