diff --git a/docs/changelog/125716.yaml b/docs/changelog/125716.yaml new file mode 100644 index 000000000000..fa85812c72c1 --- /dev/null +++ b/docs/changelog/125716.yaml @@ -0,0 +1,5 @@ +pr: 125716 +summary: Return appropriate error on null dims update instead of npe +area: Vector Search +type: bug +issues: [] diff --git a/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search.vectors/40_knn_search.yml b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search.vectors/40_knn_search.yml index 8f846dd76721..75be8d621608 100644 --- a/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search.vectors/40_knn_search.yml +++ b/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search.vectors/40_knn_search.yml @@ -605,3 +605,28 @@ setup: - match: { hits.hits.0._score: $knn_score0 } - match: { hits.hits.1._score: $knn_score1 } - match: { hits.hits.2._score: $knn_score2 } +--- +"Updating dim to null is not allowed": + - requires: + cluster_features: "mapper.npe_on_dims_update_fix" + reason: "dims update fix" + - do: + indices.create: + index: test_index + + - do: + indices.put_mapping: + index: test_index + body: + properties: + embedding: + type: dense_vector + dims: 4 + - do: + catch: bad_request + indices.put_mapping: + index: test_index + body: + properties: + embedding: + type: dense_vector diff --git a/server/src/main/java/org/elasticsearch/index/mapper/MapperFeatures.java b/server/src/main/java/org/elasticsearch/index/mapper/MapperFeatures.java index e3e3623bf815..7e16f5754a13 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/MapperFeatures.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/MapperFeatures.java @@ -39,6 +39,7 @@ public class MapperFeatures implements FeatureSpecification { static final NodeFeature UKNOWN_FIELD_MAPPING_UPDATE_ERROR_MESSAGE = new NodeFeature( "mapper.unknown_field_mapping_update_error_message" ); + static final NodeFeature NPE_ON_DIMS_UPDATE_FIX = new NodeFeature("mapper.npe_on_dims_update_fix"); @Override public Set getTestFeatures() { @@ -64,6 +65,7 @@ public class MapperFeatures implements FeatureSpecification { DOC_VALUES_SKIPPER, RESCORE_VECTOR_QUANTIZED_VECTOR_MAPPING, DateFieldMapper.INVALID_DATE_FIX, + NPE_ON_DIMS_UPDATE_FIX, RESCORE_ZERO_VECTOR_QUANTIZED_VECTOR_MAPPING ); } diff --git a/server/src/main/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldMapper.java index 11068e01d43b..b9ea4b78ec49 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/vectors/DenseVectorFieldMapper.java @@ -154,7 +154,7 @@ public class DenseVectorFieldMapper extends FieldMapper { } return XContentMapValues.nodeIntegerValue(o); - }, m -> toType(m).fieldType().dims, XContentBuilder::field, Object::toString).setSerializerCheck((id, ic, v) -> v != null) + }, m -> toType(m).fieldType().dims, XContentBuilder::field, Objects::toString).setSerializerCheck((id, ic, v) -> v != null) .setMergeValidator((previous, current, c) -> previous == null || Objects.equals(previous, current)) .addValidator(dims -> { if (dims == null) { diff --git a/x-pack/plugin/rank-vectors/src/main/java/org/elasticsearch/xpack/rank/vectors/mapper/RankVectorsFieldMapper.java b/x-pack/plugin/rank-vectors/src/main/java/org/elasticsearch/xpack/rank/vectors/mapper/RankVectorsFieldMapper.java index a595eedaf4b8..2686ab9c0b01 100644 --- a/x-pack/plugin/rank-vectors/src/main/java/org/elasticsearch/xpack/rank/vectors/mapper/RankVectorsFieldMapper.java +++ b/x-pack/plugin/rank-vectors/src/main/java/org/elasticsearch/xpack/rank/vectors/mapper/RankVectorsFieldMapper.java @@ -89,7 +89,7 @@ public class RankVectorsFieldMapper extends FieldMapper { } return XContentMapValues.nodeIntegerValue(o); - }, m -> toType(m).fieldType().dims, XContentBuilder::field, Object::toString).setSerializerCheck((id, ic, v) -> v != null) + }, m -> toType(m).fieldType().dims, XContentBuilder::field, Objects::toString).setSerializerCheck((id, ic, v) -> v != null) .setMergeValidator((previous, current, c) -> previous == null || Objects.equals(previous, current)) .addValidator(dims -> { if (dims == null) { diff --git a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/rank_vectors/rank_vectors.yml b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/rank_vectors/rank_vectors.yml index 791712ee925a..837afecb3625 100644 --- a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/rank_vectors/rank_vectors.yml +++ b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/rank_vectors/rank_vectors.yml @@ -135,3 +135,28 @@ setup: id: "1" body: vector1: [[2, -1, 1], [[2, -1, 1]]] +--- +"Updating dim to null is not allowed": + - requires: + cluster_features: "mapper.npe_on_dims_update_fix" + reason: "dims update fix" + - do: + indices.create: + index: test_index + + - do: + indices.put_mapping: + index: test_index + body: + properties: + embedding: + type: rank_vectors + dims: 4 + - do: + catch: bad_request + indices.put_mapping: + index: test_index + body: + properties: + embedding: + type: rank_vectors