diff --git a/src/main/java/org/springframework/data/elasticsearch/core/index/MappingParameters.java b/src/main/java/org/springframework/data/elasticsearch/core/index/MappingParameters.java index 1489bb9d2..d615f0923 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/index/MappingParameters.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/index/MappingParameters.java @@ -332,6 +332,8 @@ public final class MappingParameters { if (similarity != Similarity.Default) { objectNode.put(FIELD_PARAM_SIMILARITY, similarity.toString()); + // similarity must have index explicitly set, otherwise Elasticsearch returns an error + objectNode.put(FIELD_PARAM_INDEX, index); } if (termVector != TermVector.none) { diff --git a/src/test/java/org/springframework/data/elasticsearch/core/index/MappingBuilderIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/index/MappingBuilderIntegrationTests.java index 3f3912b20..f38be56f6 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/index/MappingBuilderIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/index/MappingBuilderIntegrationTests.java @@ -279,6 +279,12 @@ public abstract class MappingBuilderIntegrationTests extends MappingContextBaseT indexOps.createWithMapping(); } + @Test // #2659 + @DisplayName("should write correct mapping for dense vector property") + void shouldWriteCorrectMappingForDenseVectorProperty() { + operations.indexOps(SimilarityEntity.class).createWithMapping(); + } + // region Entities @Document(indexName = "#{@indexNameProvider.indexName()}") static class Book { @@ -901,5 +907,14 @@ public abstract class MappingBuilderIntegrationTests extends MappingContextBaseT @Nullable @Field(type = FieldType.Dense_Vector, dims = 1) String denseVectorField; } + + @Document(indexName = "#{@indexNameProvider.indexName()}") + static class SimilarityEntity { + @Nullable + @Id private String id; + + @Field(type = FieldType.Dense_Vector, dims = 42, similarity = "cosine") private double[] denseVector; + } + // endregion }