diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/elasticsearch/ElasticsearchVectorStoreAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/elasticsearch/ElasticsearchVectorStoreAutoConfiguration.java index d5e14d229c6..5430934c1ae 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/elasticsearch/ElasticsearchVectorStoreAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/elasticsearch/ElasticsearchVectorStoreAutoConfiguration.java @@ -22,8 +22,8 @@ import org.springframework.ai.embedding.BatchingStrategy; import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.embedding.TokenCountBatchingStrategy; -import org.springframework.ai.vectorstore.ElasticsearchVectorStore; -import org.springframework.ai.vectorstore.ElasticsearchVectorStoreOptions; +import org.springframework.ai.elasticsearch.vectorstore.ElasticsearchVectorStore; +import org.springframework.ai.elasticsearch.vectorstore.ElasticsearchVectorStoreOptions; import org.springframework.ai.vectorstore.observation.VectorStoreObservationConvention; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -73,9 +73,15 @@ ElasticsearchVectorStore vectorStore(ElasticsearchVectorStoreProperties properti elasticsearchVectorStoreOptions.setSimilarity(properties.getSimilarity()); } - return new ElasticsearchVectorStore(elasticsearchVectorStoreOptions, restClient, embeddingModel, - properties.isInitializeSchema(), observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP), - customObservationConvention.getIfAvailable(() -> null), batchingStrategy); + return ElasticsearchVectorStore.builder() + .restClient(restClient) + .options(elasticsearchVectorStoreOptions) + .embeddingModel(embeddingModel) + .initializeSchema(properties.isInitializeSchema()) + .observationRegistry(observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP)) + .customObservationConvention(customObservationConvention.getIfAvailable(() -> null)) + .batchingStrategy(batchingStrategy) + .build(); } } diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/elasticsearch/ElasticsearchVectorStoreProperties.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/elasticsearch/ElasticsearchVectorStoreProperties.java index bbcf95cb535..7f43af6ae55 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/elasticsearch/ElasticsearchVectorStoreProperties.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/elasticsearch/ElasticsearchVectorStoreProperties.java @@ -17,7 +17,7 @@ package org.springframework.ai.autoconfigure.vectorstore.elasticsearch; import org.springframework.ai.autoconfigure.vectorstore.CommonVectorStoreProperties; -import org.springframework.ai.vectorstore.SimilarityFunction; +import org.springframework.ai.elasticsearch.vectorstore.SimilarityFunction; import org.springframework.boot.context.properties.ConfigurationProperties; /** diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vectorstore/elasticsearch/ElasticsearchVectorStoreAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vectorstore/elasticsearch/ElasticsearchVectorStoreAutoConfigurationIT.java index c9da9584b68..0dded5637f8 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vectorstore/elasticsearch/ElasticsearchVectorStoreAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vectorstore/elasticsearch/ElasticsearchVectorStoreAutoConfigurationIT.java @@ -33,9 +33,9 @@ import org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration; import org.springframework.ai.document.Document; import org.springframework.ai.observation.conventions.VectorStoreProvider; -import org.springframework.ai.vectorstore.ElasticsearchVectorStore; +import org.springframework.ai.elasticsearch.vectorstore.ElasticsearchVectorStore; import org.springframework.ai.vectorstore.SearchRequest; -import org.springframework.ai.vectorstore.SimilarityFunction; +import org.springframework.ai.elasticsearch.vectorstore.SimilarityFunction; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration; diff --git a/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/ElasticsearchAiSearchFilterExpressionConverter.java b/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchAiSearchFilterExpressionConverter.java similarity index 98% rename from vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/ElasticsearchAiSearchFilterExpressionConverter.java rename to vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchAiSearchFilterExpressionConverter.java index 4a7dc588fde..a5a8620d604 100644 --- a/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/ElasticsearchAiSearchFilterExpressionConverter.java +++ b/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchAiSearchFilterExpressionConverter.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.elasticsearch.vectorstore; import java.text.ParseException; import java.text.SimpleDateFormat; diff --git a/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/ElasticsearchVectorStore.java b/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchVectorStore.java similarity index 74% rename from vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/ElasticsearchVectorStore.java rename to vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchVectorStore.java index 2e4cef70c72..eb65301b47d 100644 --- a/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/ElasticsearchVectorStore.java +++ b/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchVectorStore.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.elasticsearch.vectorstore; import java.io.IOException; import java.util.List; @@ -48,11 +48,12 @@ import org.springframework.ai.model.EmbeddingUtils; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; +import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; +import org.springframework.ai.vectorstore.SearchRequest; import org.springframework.ai.vectorstore.filter.Filter; import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; -import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext.Builder; import org.springframework.ai.vectorstore.observation.VectorStoreObservationConvention; import org.springframework.beans.factory.InitializingBean; import org.springframework.util.Assert; @@ -83,8 +84,6 @@ public class ElasticsearchVectorStore extends AbstractObservationVectorStore imp SimilarityFunction.cosine, VectorStoreSimilarityMetric.COSINE, SimilarityFunction.l2_norm, VectorStoreSimilarityMetric.EUCLIDEAN, SimilarityFunction.dot_product, VectorStoreSimilarityMetric.DOT); - private final EmbeddingModel embeddingModel; - private final ElasticsearchClient elasticsearchClient; private final ElasticsearchVectorStoreOptions options; @@ -95,34 +94,47 @@ public class ElasticsearchVectorStore extends AbstractObservationVectorStore imp private final BatchingStrategy batchingStrategy; + @Deprecated(since = "1.0.0-M5", forRemoval = true) public ElasticsearchVectorStore(RestClient restClient, EmbeddingModel embeddingModel, boolean initializeSchema) { this(new ElasticsearchVectorStoreOptions(), restClient, embeddingModel, initializeSchema); } + @Deprecated(since = "1.0.0-M5", forRemoval = true) public ElasticsearchVectorStore(ElasticsearchVectorStoreOptions options, RestClient restClient, EmbeddingModel embeddingModel, boolean initializeSchema) { this(options, restClient, embeddingModel, initializeSchema, ObservationRegistry.NOOP, null, new TokenCountBatchingStrategy()); } + @Deprecated(since = "1.0.0-M5", forRemoval = true) public ElasticsearchVectorStore(ElasticsearchVectorStoreOptions options, RestClient restClient, EmbeddingModel embeddingModel, boolean initializeSchema, ObservationRegistry observationRegistry, VectorStoreObservationConvention customObservationConvention, BatchingStrategy batchingStrategy) { - super(observationRegistry, customObservationConvention); + this(builder().restClient(restClient) + .options(options) + .embeddingModel(embeddingModel) + .initializeSchema(initializeSchema) + .observationRegistry(observationRegistry) + .customObservationConvention(customObservationConvention) + .batchingStrategy(batchingStrategy)); + } + + protected ElasticsearchVectorStore(ElasticsearchBuilder builder) { + super(builder); + + Assert.notNull(builder.restClient, "RestClient must not be null"); + + this.initializeSchema = builder.initializeSchema; + this.options = builder.options; + this.filterExpressionConverter = builder.filterExpressionConverter; + this.batchingStrategy = builder.batchingStrategy; - this.initializeSchema = initializeSchema; - Objects.requireNonNull(embeddingModel, "RestClient must not be null"); - Objects.requireNonNull(embeddingModel, "EmbeddingModel must not be null"); String version = Version.VERSION == null ? "Unknown" : Version.VERSION.toString(); - this.elasticsearchClient = new ElasticsearchClient(new RestClientTransport(restClient, + this.elasticsearchClient = new ElasticsearchClient(new RestClientTransport(builder.restClient, new JacksonJsonpMapper( new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)))) .withTransportOptions(t -> t.addHeader("user-agent", "spring-ai elastic-java/" + version)); - this.embeddingModel = embeddingModel; - this.options = options; - this.filterExpressionConverter = new ElasticsearchAiSearchFilterExpressionConverter(); - this.batchingStrategy = batchingStrategy; } @Override @@ -297,4 +309,93 @@ private String getSimilarityMetric() { public record ElasticSearchDocument(String id, String content, Map metadata, float[] embedding) { } + /** + * Creates a new builder instance for ElasticsearchVectorStore. + * @return a new ElasticsearchBuilder instance + */ + public static ElasticsearchBuilder builder() { + return new ElasticsearchBuilder(); + } + + public static class ElasticsearchBuilder extends AbstractVectorStoreBuilder { + + private RestClient restClient; + + private ElasticsearchVectorStoreOptions options = new ElasticsearchVectorStoreOptions(); + + private boolean initializeSchema = false; + + private BatchingStrategy batchingStrategy = new TokenCountBatchingStrategy(); + + private FilterExpressionConverter filterExpressionConverter = new ElasticsearchAiSearchFilterExpressionConverter(); + + /** + * @param restClient the Elasticsearch REST client + * @throws IllegalArgumentException if restClient is null + */ + public ElasticsearchBuilder restClient(RestClient restClient) { + Assert.notNull(restClient, "RestClient must not be null"); + this.restClient = restClient; + return this; + } + + /** + * Sets the Elasticsearch vector store options. + * @param options the vector store options to use + * @return the builder instance + * @throws IllegalArgumentException if options is null + */ + public ElasticsearchBuilder options(ElasticsearchVectorStoreOptions options) { + Assert.notNull(options, "options must not be null"); + this.options = options; + return this; + } + + /** + * Sets whether to initialize the schema. + * @param initializeSchema true to initialize schema, false otherwise + * @return the builder instance + */ + public ElasticsearchBuilder initializeSchema(boolean initializeSchema) { + this.initializeSchema = initializeSchema; + return this; + } + + /** + * Sets the batching strategy for vector operations. + * @param batchingStrategy the batching strategy to use + * @return the builder instance + * @throws IllegalArgumentException if batchingStrategy is null + */ + public ElasticsearchBuilder batchingStrategy(BatchingStrategy batchingStrategy) { + Assert.notNull(batchingStrategy, "batchingStrategy must not be null"); + this.batchingStrategy = batchingStrategy; + return this; + } + + /** + * Sets the filter expression converter. + * @param converter the filter expression converter to use + * @return the builder instance + * @throws IllegalArgumentException if converter is null + */ + public ElasticsearchBuilder filterExpressionConverter(FilterExpressionConverter converter) { + Assert.notNull(converter, "filterExpressionConverter must not be null"); + this.filterExpressionConverter = converter; + return this; + } + + /** + * Builds the ElasticsearchVectorStore instance. + * @return a new ElasticsearchVectorStore instance + * @throws IllegalStateException if the builder is in an invalid state + */ + @Override + public ElasticsearchVectorStore build() { + validate(); + return new ElasticsearchVectorStore(this); + } + + } + } diff --git a/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/ElasticsearchVectorStoreOptions.java b/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchVectorStoreOptions.java similarity index 96% rename from vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/ElasticsearchVectorStoreOptions.java rename to vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchVectorStoreOptions.java index 8aee18ac030..08577be4d3c 100644 --- a/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/ElasticsearchVectorStoreOptions.java +++ b/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchVectorStoreOptions.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.elasticsearch.vectorstore; /** * Provided Elasticsearch vector option configuration. diff --git a/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/SimilarityFunction.java b/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/elasticsearch/vectorstore/SimilarityFunction.java similarity index 94% rename from vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/SimilarityFunction.java rename to vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/elasticsearch/vectorstore/SimilarityFunction.java index b28e7313d41..93cd8423289 100644 --- a/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/SimilarityFunction.java +++ b/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/elasticsearch/vectorstore/SimilarityFunction.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.elasticsearch.vectorstore; /** * https://www.elastic.co/guide/en/elasticsearch/reference/master/dense-vector.html diff --git a/vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/vectorstore/ElasticsearchAiSearchFilterExpressionConverterTest.java b/vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchAiSearchFilterExpressionConverterTest.java similarity index 98% rename from vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/vectorstore/ElasticsearchAiSearchFilterExpressionConverterTest.java rename to vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchAiSearchFilterExpressionConverterTest.java index 7a6f737ee60..7922c6b22ef 100644 --- a/vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/vectorstore/ElasticsearchAiSearchFilterExpressionConverterTest.java +++ b/vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchAiSearchFilterExpressionConverterTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.elasticsearch.vectorstore; import java.util.Date; import java.util.List; diff --git a/vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/vectorstore/ElasticsearchImage.java b/vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchImage.java similarity index 94% rename from vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/vectorstore/ElasticsearchImage.java rename to vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchImage.java index 6cc156f358c..d68229523f7 100644 --- a/vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/vectorstore/ElasticsearchImage.java +++ b/vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchImage.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.elasticsearch.vectorstore; import org.testcontainers.utility.DockerImageName; diff --git a/vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/vectorstore/ElasticsearchVectorStoreIT.java b/vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchVectorStoreIT.java similarity index 96% rename from vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/vectorstore/ElasticsearchVectorStoreIT.java rename to vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchVectorStoreIT.java index 2372a5d9c33..76eb441ca14 100644 --- a/vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/vectorstore/ElasticsearchVectorStoreIT.java +++ b/vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchVectorStoreIT.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.elasticsearch.vectorstore; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -51,6 +51,7 @@ import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.openai.OpenAiEmbeddingModel; import org.springframework.ai.openai.api.OpenAiApi; +import org.springframework.ai.vectorstore.SearchRequest; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; @@ -376,7 +377,11 @@ public static class TestApplication { @Bean("vectorStore_cosine") public ElasticsearchVectorStore vectorStoreDefault(EmbeddingModel embeddingModel, RestClient restClient) { - return new ElasticsearchVectorStore(restClient, embeddingModel, true); + return ElasticsearchVectorStore.builder() + .restClient(restClient) + .embeddingModel(embeddingModel) + .initializeSchema(true) + .build(); } @Bean("vectorStore_l2_norm") @@ -384,7 +389,12 @@ public ElasticsearchVectorStore vectorStoreL2(EmbeddingModel embeddingModel, Res ElasticsearchVectorStoreOptions options = new ElasticsearchVectorStoreOptions(); options.setIndexName("index_l2"); options.setSimilarity(SimilarityFunction.l2_norm); - return new ElasticsearchVectorStore(options, restClient, embeddingModel, true); + return ElasticsearchVectorStore.builder() + .restClient(restClient) + .embeddingModel(embeddingModel) + .initializeSchema(true) + .options(options) + .build(); } @Bean("vectorStore_dot_product") @@ -392,7 +402,12 @@ public ElasticsearchVectorStore vectorStoreDotProduct(EmbeddingModel embeddingMo ElasticsearchVectorStoreOptions options = new ElasticsearchVectorStoreOptions(); options.setIndexName("index_dot_product"); options.setSimilarity(SimilarityFunction.dot_product); - return new ElasticsearchVectorStore(options, restClient, embeddingModel, true); + return ElasticsearchVectorStore.builder() + .restClient(restClient) + .embeddingModel(embeddingModel) + .initializeSchema(true) + .options(options) + .build(); } @Bean diff --git a/vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/vectorstore/ElasticsearchVectorStoreObservationIT.java b/vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchVectorStoreObservationIT.java similarity index 94% rename from vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/vectorstore/ElasticsearchVectorStoreObservationIT.java rename to vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchVectorStoreObservationIT.java index 1d074fba087..278a71c46c8 100644 --- a/vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/vectorstore/ElasticsearchVectorStoreObservationIT.java +++ b/vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/elasticsearch/vectorstore/ElasticsearchVectorStoreObservationIT.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.elasticsearch.vectorstore; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -51,6 +51,8 @@ import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; import org.springframework.ai.openai.OpenAiEmbeddingModel; import org.springframework.ai.openai.api.OpenAiApi; +import org.springframework.ai.vectorstore.SearchRequest; +import org.springframework.ai.vectorstore.VectorStore; import org.springframework.ai.vectorstore.observation.DefaultVectorStoreObservationConvention; import org.springframework.ai.vectorstore.observation.VectorStoreObservationDocumentation.HighCardinalityKeyNames; import org.springframework.ai.vectorstore.observation.VectorStoreObservationDocumentation.LowCardinalityKeyNames; @@ -67,6 +69,7 @@ /** * @author Christian Tzolov * @author Thomas Vitale + * @author Soby Chacko */ @Testcontainers @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".+") @@ -205,8 +208,15 @@ public TestObservationRegistry observationRegistry() { @Bean public ElasticsearchVectorStore vectorStoreDefault(EmbeddingModel embeddingModel, RestClient restClient, ObservationRegistry observationRegistry) { - return new ElasticsearchVectorStore(new ElasticsearchVectorStoreOptions(), restClient, embeddingModel, true, - observationRegistry, null, new TokenCountBatchingStrategy()); + return ElasticsearchVectorStore.builder() + .restClient(restClient) + .embeddingModel(embeddingModel) + .initializeSchema(true) + .options(new ElasticsearchVectorStoreOptions()) + .observationRegistry(observationRegistry) + .customObservationConvention(null) + .batchingStrategy(new TokenCountBatchingStrategy()) + .build(); } @Bean