diff --git a/models/spring-ai-openai/pom.xml b/models/spring-ai-openai/pom.xml index 715e3474f..135b95f14 100644 --- a/models/spring-ai-openai/pom.xml +++ b/models/spring-ai-openai/pom.xml @@ -77,7 +77,7 @@ org.springframework.ai - spring-ai-qdrant + spring-ai-qdrant-store ${project.version} diff --git a/pom.xml b/pom.xml index d9f873b09..c5e2e767d 100644 --- a/pom.xml +++ b/pom.xml @@ -13,67 +13,73 @@ Building AI applications with Spring Boot + spring-ai-docs spring-ai-bom spring-ai-core - models/spring-ai-transformers - models/spring-ai-postgresml - models/spring-ai-bedrock - models/spring-ai-azure-openai - models/spring-ai-huggingface - models/spring-ai-ollama - models/spring-ai-openai - models/spring-ai-stability-ai - models/spring-ai-mistral-ai - models/spring-ai-vertex-ai-palm2 - models/spring-ai-vertex-ai-gemini - models/spring-ai-anthropic - models/spring-ai-watsonx-ai spring-ai-test spring-ai-spring-boot-autoconfigure - spring-ai-spring-boot-starters/spring-ai-starter-openai - spring-ai-spring-boot-starters/spring-ai-starter-azure-openai - spring-ai-spring-boot-starters/spring-ai-starter-ollama - spring-ai-spring-boot-starters/spring-ai-starter-transformers - spring-ai-spring-boot-starters/spring-ai-starter-cassandra - spring-ai-spring-boot-starters/spring-ai-starter-chroma-store - spring-ai-spring-boot-starters/spring-ai-starter-milvus-store - spring-ai-spring-boot-starters/spring-ai-starter-pgvector-store - spring-ai-spring-boot-starters/spring-ai-starter-hanadb-store - spring-ai-spring-boot-starters/spring-ai-starter-pinecone-store - spring-ai-spring-boot-starters/spring-ai-starter-azure-store - spring-ai-spring-boot-starters/spring-ai-starter-weaviate-store - spring-ai-spring-boot-starters/spring-ai-starter-redis - spring-ai-spring-boot-starters/spring-ai-starter-stability-ai - spring-ai-spring-boot-starters/spring-ai-starter-neo4j-store - spring-ai-spring-boot-starters/spring-ai-starter-qdrant-store - spring-ai-spring-boot-starters/spring-ai-starter-postgresml-embedding - spring-ai-docs - vector-stores/spring-ai-cassandra - vector-stores/spring-ai-pgvector-store - vector-stores/spring-ai-hanadb-store - vector-stores/spring-ai-milvus-store - vector-stores/spring-ai-neo4j-store + spring-ai-retry + spring-ai-spring-boot-testcontainers + document-readers/pdf-reader document-readers/tika-reader - vector-stores/spring-ai-pinecone - vector-stores/spring-ai-chroma-store + vector-stores/spring-ai-azure-store + vector-stores/spring-ai-cassandra-store + vector-stores/spring-ai-chroma-store + vector-stores/spring-ai-elasticsearch-store + vector-stores/spring-ai-gemfire-store + vector-stores/spring-ai-hanadb-store + vector-stores/spring-ai-milvus-store + vector-stores/spring-ai-mongodb-atlas-store + vector-stores/spring-ai-neo4j-store + vector-stores/spring-ai-pgvector-store + vector-stores/spring-ai-pinecone-store + vector-stores/spring-ai-qdrant-store + vector-stores/spring-ai-redis-store vector-stores/spring-ai-weaviate-store - vector-stores/spring-ai-redis - vector-stores/spring-ai-gemfire - spring-ai-spring-boot-starters/spring-ai-starter-vertex-ai-palm2 - spring-ai-spring-boot-starters/spring-ai-starter-vertex-ai-gemini - vector-stores/spring-ai-qdrant + + spring-ai-spring-boot-starters/spring-ai-starter-azure-store + spring-ai-spring-boot-starters/spring-ai-starter-cassandra-store + spring-ai-spring-boot-starters/spring-ai-starter-chroma-store + spring-ai-spring-boot-starters/spring-ai-starter-elasticsearch-store + spring-ai-spring-boot-starters/spring-ai-starter-hanadb-store + spring-ai-spring-boot-starters/spring-ai-starter-milvus-store + spring-ai-spring-boot-starters/spring-ai-starter-mongodb-atlas-store + spring-ai-spring-boot-starters/spring-ai-starter-neo4j-store + spring-ai-spring-boot-starters/spring-ai-starter-pgvector-store + spring-ai-spring-boot-starters/spring-ai-starter-pinecone-store + spring-ai-spring-boot-starters/spring-ai-starter-qdrant-store + spring-ai-spring-boot-starters/spring-ai-starter-redis-store + spring-ai-spring-boot-starters/spring-ai-starter-weaviate-store + + models/spring-ai-anthropic + models/spring-ai-azure-openai + models/spring-ai-bedrock + models/spring-ai-huggingface + models/spring-ai-mistral-ai + models/spring-ai-ollama + models/spring-ai-openai + models/spring-ai-postgresml + models/spring-ai-stability-ai + models/spring-ai-transformers + models/spring-ai-vertex-ai-gemini + models/spring-ai-vertex-ai-palm2 + models/spring-ai-watsonx-ai + + spring-ai-spring-boot-starters/spring-ai-starter-anthropic + spring-ai-spring-boot-starters/spring-ai-starter-azure-openai spring-ai-spring-boot-starters/spring-ai-starter-bedrock-ai spring-ai-spring-boot-starters/spring-ai-starter-mistral-ai - spring-ai-retry - vector-stores/spring-ai-mongodb-atlas-store - spring-ai-spring-boot-starters/spring-ai-starter-mongodb-atlas-store - spring-ai-spring-boot-testcontainers - spring-ai-spring-boot-starters/spring-ai-starter-anthropic - vector-stores/spring-ai-elasticsearch-store + spring-ai-spring-boot-starters/spring-ai-starter-ollama + spring-ai-spring-boot-starters/spring-ai-starter-openai + spring-ai-spring-boot-starters/spring-ai-starter-postgresml-embedding + spring-ai-spring-boot-starters/spring-ai-starter-stability-ai + spring-ai-spring-boot-starters/spring-ai-starter-transformers + spring-ai-spring-boot-starters/spring-ai-starter-vertex-ai-gemini + spring-ai-spring-boot-starters/spring-ai-starter-vertex-ai-palm2 spring-ai-spring-boot-starters/spring-ai-starter-watsonx-ai - spring-ai-spring-boot-starters/spring-ai-starter-elasticsearch-store + diff --git a/spring-ai-bom/pom.xml b/spring-ai-bom/pom.xml index 507a8b401..0c651b56e 100644 --- a/spring-ai-bom/pom.xml +++ b/spring-ai-bom/pom.xml @@ -134,7 +134,7 @@ org.springframework.ai - spring-ai-cassandra + spring-ai-cassandra-store ${project.version} @@ -170,13 +170,13 @@ org.springframework.ai - spring-ai-pinecone + spring-ai-pinecone-store ${project.version} org.springframework.ai - spring-ai-redis + spring-ai-redis-store ${project.version} @@ -188,7 +188,7 @@ org.springframework.ai - spring-ai-qdrant + spring-ai-qdrant-store ${project.version} @@ -206,7 +206,7 @@ org.springframework.ai - spring-ai-gemfire + spring-ai-gemfire-store ${project.version} @@ -238,7 +238,7 @@ org.springframework.ai - spring-ai-azure-vector-store-spring-boot-starter + spring-ai-azure-store-spring-boot-starter ${project.version} @@ -316,7 +316,7 @@ org.springframework.ai - spring-ai-redis-spring-boot-starter + spring-ai-redis-store-spring-boot-starter ${project.version} diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/apache-cassandra.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/apache-cassandra.adoc index 51c6110cb..b1c9d9f0d 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/apache-cassandra.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/apache-cassandra.adoc @@ -57,7 +57,7 @@ Add these dependencies to your project: ---- org.springframework.ai - spring-ai-cassandra + spring-ai-cassandra-store ---- @@ -67,7 +67,7 @@ Add these dependencies to your project: ---- org.springframework.ai - spring-ai-cassandra-spring-boot-starter + spring-ai-cassandra-store-spring-boot-starter ---- diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/gemfire.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/gemfire.adoc index dff91d575..c09a45ef7 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/gemfire.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/gemfire.adoc @@ -37,7 +37,7 @@ Add these dependencies to your project: ---- org.springframework.ai - spring-ai-gemfire + spring-ai-gemfire-store ---- diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/pinecone.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/pinecone.adoc index 7cb9132b7..ee7942711 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/pinecone.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/pinecone.adoc @@ -172,7 +172,7 @@ Add these dependencies to your project: ---- org.springframework.ai - spring-ai-pinecone + spring-ai-pinecone-store ---- diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/qdrant.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/qdrant.adoc index 5ebaf926e..87aef84f9 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/qdrant.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/qdrant.adoc @@ -147,13 +147,13 @@ NOTE: These filter expressions are converted into the equivalent Qdrant link:htt == Manual Configuration -Instead of using the Spring Boot auto-configuration, you can manually configure the `QdrantVectorStore`. For this you need to add the `spring-ai-qdrant` dependency to your project: +Instead of using the Spring Boot auto-configuration, you can manually configure the `QdrantVectorStore`. For this you need to add the `spring-ai-qdrant-store` dependency to your project: [source,xml] ---- org.springframework.ai - spring-ai-qdrant + spring-ai-qdrant-store ---- diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/redis.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/redis.adoc index 7adfd60c4..436fd59ce 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/redis.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/redis.adoc @@ -162,7 +162,7 @@ Add the Redis Vector Store and Jedis dependencies ---- org.springframework.ai - spring-ai-redis + spring-ai-redis-store diff --git a/spring-ai-spring-boot-autoconfigure/pom.xml b/spring-ai-spring-boot-autoconfigure/pom.xml index 38e867b1c..09b48fc71 100644 --- a/spring-ai-spring-boot-autoconfigure/pom.xml +++ b/spring-ai-spring-boot-autoconfigure/pom.xml @@ -80,7 +80,7 @@ org.springframework.ai - spring-ai-pinecone + spring-ai-pinecone-store ${project.parent.version} true @@ -149,7 +149,7 @@ org.springframework.ai - spring-ai-cassandra + spring-ai-cassandra-store ${project.parent.version} true @@ -165,7 +165,7 @@ org.springframework.ai - spring-ai-redis + spring-ai-redis-store ${project.parent.version} true @@ -242,7 +242,7 @@ org.springframework.ai - spring-ai-qdrant + spring-ai-qdrant-store ${project.parent.version} true diff --git a/spring-ai-spring-boot-starters/spring-ai-starter-azure-store/pom.xml b/spring-ai-spring-boot-starters/spring-ai-starter-azure-store/pom.xml index c6b1d7276..d9292532e 100644 --- a/spring-ai-spring-boot-starters/spring-ai-starter-azure-store/pom.xml +++ b/spring-ai-spring-boot-starters/spring-ai-starter-azure-store/pom.xml @@ -7,7 +7,7 @@ 1.0.0-SNAPSHOT ../../pom.xml - spring-ai-azure-vector-store-spring-boot-starter + spring-ai-azure-store-spring-boot-starter jar Spring AI Starter - Azure Vector Store Spring AI Azure Vector Store Auto Configuration diff --git a/spring-ai-spring-boot-starters/spring-ai-starter-cassandra/pom.xml b/spring-ai-spring-boot-starters/spring-ai-starter-cassandra-store/pom.xml similarity index 92% rename from spring-ai-spring-boot-starters/spring-ai-starter-cassandra/pom.xml rename to spring-ai-spring-boot-starters/spring-ai-starter-cassandra-store/pom.xml index a40111ee8..00b58ba75 100644 --- a/spring-ai-spring-boot-starters/spring-ai-starter-cassandra/pom.xml +++ b/spring-ai-spring-boot-starters/spring-ai-starter-cassandra-store/pom.xml @@ -7,7 +7,7 @@ 1.0.0-SNAPSHOT ../../pom.xml - spring-ai-cassandra-spring-boot-starter + spring-ai-cassandra-store-spring-boot-starter jar Spring AI Starter - Apache Cassandra Vector Store Spring AI Apache Cassandra Vector Store Auto Configuration @@ -34,7 +34,7 @@ org.springframework.ai - spring-ai-cassandra + spring-ai-cassandra-store ${project.parent.version} diff --git a/spring-ai-spring-boot-starters/spring-ai-starter-pinecone-store/pom.xml b/spring-ai-spring-boot-starters/spring-ai-starter-pinecone-store/pom.xml index 1a46b3bd7..aefe6a0a6 100644 --- a/spring-ai-spring-boot-starters/spring-ai-starter-pinecone-store/pom.xml +++ b/spring-ai-spring-boot-starters/spring-ai-starter-pinecone-store/pom.xml @@ -34,7 +34,7 @@ org.springframework.ai - spring-ai-pinecone + spring-ai-pinecone-store ${project.parent.version} diff --git a/spring-ai-spring-boot-starters/spring-ai-starter-qdrant-store/pom.xml b/spring-ai-spring-boot-starters/spring-ai-starter-qdrant-store/pom.xml index 4a578cca6..acbfe9a28 100644 --- a/spring-ai-spring-boot-starters/spring-ai-starter-qdrant-store/pom.xml +++ b/spring-ai-spring-boot-starters/spring-ai-starter-qdrant-store/pom.xml @@ -34,7 +34,7 @@ org.springframework.ai - spring-ai-qdrant + spring-ai-qdrant-store ${project.parent.version} diff --git a/spring-ai-spring-boot-starters/spring-ai-starter-redis/pom.xml b/spring-ai-spring-boot-starters/spring-ai-starter-redis-store/pom.xml similarity index 92% rename from spring-ai-spring-boot-starters/spring-ai-starter-redis/pom.xml rename to spring-ai-spring-boot-starters/spring-ai-starter-redis-store/pom.xml index 5d6794fb2..09fe4abb2 100644 --- a/spring-ai-spring-boot-starters/spring-ai-starter-redis/pom.xml +++ b/spring-ai-spring-boot-starters/spring-ai-starter-redis-store/pom.xml @@ -7,7 +7,7 @@ 1.0.0-SNAPSHOT ../../pom.xml - spring-ai-redis-spring-boot-starter + spring-ai-redis-store-spring-boot-starter jar Spring AI Starter - Redis Vector Store Spring AI Redis Vector Store Auto Configuration @@ -34,7 +34,7 @@ org.springframework.ai - spring-ai-redis + spring-ai-redis-store ${project.parent.version} diff --git a/spring-ai-spring-boot-testcontainers/pom.xml b/spring-ai-spring-boot-testcontainers/pom.xml index 9758c4bc7..ca44ac49f 100644 --- a/spring-ai-spring-boot-testcontainers/pom.xml +++ b/spring-ai-spring-boot-testcontainers/pom.xml @@ -94,7 +94,7 @@ org.springframework.ai - spring-ai-redis + spring-ai-redis-store ${project.parent.version} true @@ -110,7 +110,7 @@ org.springframework.ai - spring-ai-qdrant + spring-ai-qdrant-store ${project.parent.version} true diff --git a/vector-stores/spring-ai-azure-store/src/main/java/org/springframework/ai/vectorstore/azure/AzureVectorStore.java b/vector-stores/spring-ai-azure-store/src/main/java/org/springframework/ai/vectorstore/azure/AzureVectorStore.java index 36417d669..e0d8d9188 100644 --- a/vector-stores/spring-ai-azure-store/src/main/java/org/springframework/ai/vectorstore/azure/AzureVectorStore.java +++ b/vector-stores/spring-ai-azure-store/src/main/java/org/springframework/ai/vectorstore/azure/AzureVectorStore.java @@ -49,9 +49,7 @@ import org.springframework.ai.embedding.EmbeddingClient; import org.springframework.ai.vectorstore.SearchRequest; import org.springframework.ai.vectorstore.VectorStore; import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; -import org.springframework.boot.context.event.ApplicationReadyEvent; -import org.springframework.context.ApplicationListener; -import org.springframework.lang.NonNull; +import org.springframework.beans.factory.InitializingBean; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -65,9 +63,8 @@ import org.springframework.util.StringUtils; * @author Greg Meyer * @author Xiangyang Yu * @author Christian Tzolov - * @author Josh Long */ -public class AzureVectorStore implements VectorStore, ApplicationListener { +public class AzureVectorStore implements VectorStore, InitializingBean { private static final Logger logger = LoggerFactory.getLogger(AzureVectorStore.class); @@ -118,53 +115,6 @@ public class AzureVectorStore implements VectorStore, ApplicationListener filterMetadataFields; - @Override - public void onApplicationEvent(@NonNull ApplicationReadyEvent event) { - - int dimensions = this.embeddingClient.dimensions(); - - List fields = new ArrayList<>(); - - fields.add(new SearchField(ID_FIELD_NAME, SearchFieldDataType.STRING).setKey(true) - .setFilterable(true) - .setSortable(true)); - fields.add(new SearchField(EMBEDDING_FIELD_NAME, SearchFieldDataType.collection(SearchFieldDataType.SINGLE)) - .setSearchable(true) - .setVectorSearchDimensions(dimensions) - // This must match a vector search configuration name. - .setVectorSearchProfileName(SPRING_AI_VECTOR_PROFILE)); - fields.add(new SearchField(CONTENT_FIELD_NAME, SearchFieldDataType.STRING).setSearchable(true) - .setFilterable(true)); - fields.add(new SearchField(METADATA_FIELD_NAME, SearchFieldDataType.STRING).setSearchable(true) - .setFilterable(true)); - - for (MetadataField filterableMetadataField : this.filterMetadataFields) { - fields.add(new SearchField(METADATA_FIELD_PREFIX + filterableMetadataField.name(), - filterableMetadataField.fieldType()) - .setSearchable(false) - .setFacetable(true)); - } - - SearchIndex searchIndex = new SearchIndex(this.indexName).setFields(fields) - // VectorSearch configuration is required for a vector field. The name used - // for the vector search algorithm configuration must match the configuration - // used by the search field used for vector search. - .setVectorSearch(new VectorSearch() - .setProfiles(Collections - .singletonList(new VectorSearchProfile(SPRING_AI_VECTOR_PROFILE, SPRING_AI_VECTOR_CONFIG))) - .setAlgorithms(Collections.singletonList(new HnswAlgorithmConfiguration(SPRING_AI_VECTOR_CONFIG) - .setParameters(new HnswParameters().setM(4) - .setEfConstruction(400) - .setEfSearch(1000) - .setMetric(VectorSearchAlgorithmMetric.COSINE))))); - - SearchIndex index = this.searchIndexClient.createOrUpdateIndex(searchIndex); - - logger.info("Created search index: " + index.getName()); - - this.searchClient = this.searchIndexClient.getSearchClient(this.indexName); - } - public record MetadataField(String name, SearchFieldDataType fieldType) { public static MetadataField text(String name) { @@ -375,4 +325,51 @@ public class AzureVectorStore implements VectorStore, ApplicationListener embedding, String metadata) { } -} + @Override + public void afterPropertiesSet() throws Exception { + + int dimensions = this.embeddingClient.dimensions(); + + List fields = new ArrayList<>(); + + fields.add(new SearchField(ID_FIELD_NAME, SearchFieldDataType.STRING).setKey(true) + .setFilterable(true) + .setSortable(true)); + fields.add(new SearchField(EMBEDDING_FIELD_NAME, SearchFieldDataType.collection(SearchFieldDataType.SINGLE)) + .setSearchable(true) + .setVectorSearchDimensions(dimensions) + // This must match a vector search configuration name. + .setVectorSearchProfileName(SPRING_AI_VECTOR_PROFILE)); + fields.add(new SearchField(CONTENT_FIELD_NAME, SearchFieldDataType.STRING).setSearchable(true) + .setFilterable(true)); + fields.add(new SearchField(METADATA_FIELD_NAME, SearchFieldDataType.STRING).setSearchable(true) + .setFilterable(true)); + + for (MetadataField filterableMetadataField : this.filterMetadataFields) { + fields.add(new SearchField(METADATA_FIELD_PREFIX + filterableMetadataField.name(), + filterableMetadataField.fieldType()) + .setSearchable(false) + .setFacetable(true)); + } + + SearchIndex searchIndex = new SearchIndex(this.indexName).setFields(fields) + // VectorSearch configuration is required for a vector field. The name used + // for the vector search algorithm configuration must match the configuration + // used by the search field used for vector search. + .setVectorSearch(new VectorSearch() + .setProfiles(Collections + .singletonList(new VectorSearchProfile(SPRING_AI_VECTOR_PROFILE, SPRING_AI_VECTOR_CONFIG))) + .setAlgorithms(Collections.singletonList(new HnswAlgorithmConfiguration(SPRING_AI_VECTOR_CONFIG) + .setParameters(new HnswParameters().setM(4) + .setEfConstruction(400) + .setEfSearch(1000) + .setMetric(VectorSearchAlgorithmMetric.COSINE))))); + + SearchIndex index = this.searchIndexClient.createOrUpdateIndex(searchIndex); + + logger.info("Created search index: " + index.getName()); + + this.searchClient = this.searchIndexClient.getSearchClient(this.indexName); + } + +} \ No newline at end of file diff --git a/vector-stores/spring-ai-cassandra/README.md b/vector-stores/spring-ai-cassandra-store/README.md similarity index 100% rename from vector-stores/spring-ai-cassandra/README.md rename to vector-stores/spring-ai-cassandra-store/README.md diff --git a/vector-stores/spring-ai-cassandra/pom.xml b/vector-stores/spring-ai-cassandra-store/pom.xml similarity index 97% rename from vector-stores/spring-ai-cassandra/pom.xml rename to vector-stores/spring-ai-cassandra-store/pom.xml index b01d200f8..fad401cfd 100644 --- a/vector-stores/spring-ai-cassandra/pom.xml +++ b/vector-stores/spring-ai-cassandra-store/pom.xml @@ -8,7 +8,7 @@ 1.0.0-SNAPSHOT ../../pom.xml - spring-ai-cassandra + spring-ai-cassandra-store jar Spring AI Vector Store – Apache Cassandra Spring AI Vector Store for Apache Cassandra diff --git a/vector-stores/spring-ai-cassandra/src/main/java/org/springframework/ai/vectorstore/CassandraFilterExpressionConverter.java b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/CassandraFilterExpressionConverter.java similarity index 100% rename from vector-stores/spring-ai-cassandra/src/main/java/org/springframework/ai/vectorstore/CassandraFilterExpressionConverter.java rename to vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/CassandraFilterExpressionConverter.java diff --git a/vector-stores/spring-ai-cassandra/src/main/java/org/springframework/ai/vectorstore/CassandraVectorStore.java b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/CassandraVectorStore.java similarity index 100% rename from vector-stores/spring-ai-cassandra/src/main/java/org/springframework/ai/vectorstore/CassandraVectorStore.java rename to vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/CassandraVectorStore.java diff --git a/vector-stores/spring-ai-cassandra/src/main/java/org/springframework/ai/vectorstore/CassandraVectorStoreConfig.java b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/CassandraVectorStoreConfig.java similarity index 100% rename from vector-stores/spring-ai-cassandra/src/main/java/org/springframework/ai/vectorstore/CassandraVectorStoreConfig.java rename to vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/CassandraVectorStoreConfig.java diff --git a/vector-stores/spring-ai-cassandra/src/main/resources/application.conf b/vector-stores/spring-ai-cassandra-store/src/main/resources/application.conf similarity index 100% rename from vector-stores/spring-ai-cassandra/src/main/resources/application.conf rename to vector-stores/spring-ai-cassandra-store/src/main/resources/application.conf diff --git a/vector-stores/spring-ai-cassandra/src/test/java/org/springframework/ai/vectorstore/CassandraFilterExpressionConverterTests.java b/vector-stores/spring-ai-cassandra-store/src/test/java/org/springframework/ai/vectorstore/CassandraFilterExpressionConverterTests.java similarity index 100% rename from vector-stores/spring-ai-cassandra/src/test/java/org/springframework/ai/vectorstore/CassandraFilterExpressionConverterTests.java rename to vector-stores/spring-ai-cassandra-store/src/test/java/org/springframework/ai/vectorstore/CassandraFilterExpressionConverterTests.java diff --git a/vector-stores/spring-ai-cassandra/src/test/java/org/springframework/ai/vectorstore/CassandraRichSchemaVectorStoreIT.java b/vector-stores/spring-ai-cassandra-store/src/test/java/org/springframework/ai/vectorstore/CassandraRichSchemaVectorStoreIT.java similarity index 100% rename from vector-stores/spring-ai-cassandra/src/test/java/org/springframework/ai/vectorstore/CassandraRichSchemaVectorStoreIT.java rename to vector-stores/spring-ai-cassandra-store/src/test/java/org/springframework/ai/vectorstore/CassandraRichSchemaVectorStoreIT.java diff --git a/vector-stores/spring-ai-cassandra/src/test/java/org/springframework/ai/vectorstore/CassandraVectorStoreIT.java b/vector-stores/spring-ai-cassandra-store/src/test/java/org/springframework/ai/vectorstore/CassandraVectorStoreIT.java similarity index 100% rename from vector-stores/spring-ai-cassandra/src/test/java/org/springframework/ai/vectorstore/CassandraVectorStoreIT.java rename to vector-stores/spring-ai-cassandra-store/src/test/java/org/springframework/ai/vectorstore/CassandraVectorStoreIT.java diff --git a/vector-stores/spring-ai-cassandra/src/test/java/org/springframework/ai/vectorstore/WikiVectorStoreExample.java b/vector-stores/spring-ai-cassandra-store/src/test/java/org/springframework/ai/vectorstore/WikiVectorStoreExample.java similarity index 100% rename from vector-stores/spring-ai-cassandra/src/test/java/org/springframework/ai/vectorstore/WikiVectorStoreExample.java rename to vector-stores/spring-ai-cassandra-store/src/test/java/org/springframework/ai/vectorstore/WikiVectorStoreExample.java diff --git a/vector-stores/spring-ai-cassandra/src/test/resources/application.conf b/vector-stores/spring-ai-cassandra-store/src/test/resources/application.conf similarity index 100% rename from vector-stores/spring-ai-cassandra/src/test/resources/application.conf rename to vector-stores/spring-ai-cassandra-store/src/test/resources/application.conf diff --git a/vector-stores/spring-ai-cassandra/src/test/resources/test_wiki_full_schema.cql b/vector-stores/spring-ai-cassandra-store/src/test/resources/test_wiki_full_schema.cql similarity index 100% rename from vector-stores/spring-ai-cassandra/src/test/resources/test_wiki_full_schema.cql rename to vector-stores/spring-ai-cassandra-store/src/test/resources/test_wiki_full_schema.cql diff --git a/vector-stores/spring-ai-cassandra/src/test/resources/test_wiki_partial_0_schema.cql b/vector-stores/spring-ai-cassandra-store/src/test/resources/test_wiki_partial_0_schema.cql similarity index 100% rename from vector-stores/spring-ai-cassandra/src/test/resources/test_wiki_partial_0_schema.cql rename to vector-stores/spring-ai-cassandra-store/src/test/resources/test_wiki_partial_0_schema.cql diff --git a/vector-stores/spring-ai-cassandra/src/test/resources/test_wiki_partial_1_schema.cql b/vector-stores/spring-ai-cassandra-store/src/test/resources/test_wiki_partial_1_schema.cql similarity index 100% rename from vector-stores/spring-ai-cassandra/src/test/resources/test_wiki_partial_1_schema.cql rename to vector-stores/spring-ai-cassandra-store/src/test/resources/test_wiki_partial_1_schema.cql diff --git a/vector-stores/spring-ai-cassandra/src/test/resources/test_wiki_partial_2_schema.cql b/vector-stores/spring-ai-cassandra-store/src/test/resources/test_wiki_partial_2_schema.cql similarity index 100% rename from vector-stores/spring-ai-cassandra/src/test/resources/test_wiki_partial_2_schema.cql rename to vector-stores/spring-ai-cassandra-store/src/test/resources/test_wiki_partial_2_schema.cql diff --git a/vector-stores/spring-ai-cassandra/src/test/resources/test_wiki_partial_3_schema.cql b/vector-stores/spring-ai-cassandra-store/src/test/resources/test_wiki_partial_3_schema.cql similarity index 100% rename from vector-stores/spring-ai-cassandra/src/test/resources/test_wiki_partial_3_schema.cql rename to vector-stores/spring-ai-cassandra-store/src/test/resources/test_wiki_partial_3_schema.cql diff --git a/vector-stores/spring-ai-cassandra/src/test/resources/test_wiki_partial_4_schema.cql b/vector-stores/spring-ai-cassandra-store/src/test/resources/test_wiki_partial_4_schema.cql similarity index 100% rename from vector-stores/spring-ai-cassandra/src/test/resources/test_wiki_partial_4_schema.cql rename to vector-stores/spring-ai-cassandra-store/src/test/resources/test_wiki_partial_4_schema.cql diff --git a/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/vectorstore/ChromaVectorStore.java b/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/vectorstore/ChromaVectorStore.java index a53d02e9a..40ede3a67 100644 --- a/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/vectorstore/ChromaVectorStore.java +++ b/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/vectorstore/ChromaVectorStore.java @@ -29,9 +29,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.embedding.EmbeddingClient; import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; import org.springframework.ai.vectorstore.filter.converter.ChromaFilterExpressionConverter; -import org.springframework.boot.context.event.ApplicationReadyEvent; -import org.springframework.context.ApplicationListener; -import org.springframework.lang.NonNull; +import org.springframework.beans.factory.InitializingBean; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -42,10 +40,8 @@ import org.springframework.util.StringUtils; * their similarity to a query, using the {@link ChromaApi} and {@link EmbeddingClient} * for embedding calculations. For more information about how it does this, see the * official Chroma website. - * - * @author Christian Tzolov */ -public class ChromaVectorStore implements VectorStore, ApplicationListener { +public class ChromaVectorStore implements VectorStore, InitializingBean { public static final String DISTANCE_FIELD_NAME = "distance"; @@ -151,7 +147,7 @@ public class ChromaVectorStore implements VectorStore, ApplicationListener { +public class ElasticsearchVectorStore implements VectorStore, InitializingBean { // divided by 2 to get score in the range [0, 1] public static final String COSINE_SIMILARITY_FUNCTION = "(cosineSimilarity(params.query_vector, 'embedding') + 1.0) / 2"; @@ -221,10 +219,10 @@ public class ElasticsearchVectorStore implements VectorStore, ApplicationListene } @Override - public void onApplicationEvent(ApplicationReadyEvent event) { + public void afterPropertiesSet() { if (!indexExists()) { createIndexMapping(); } } -} +} \ No newline at end of file diff --git a/vector-stores/spring-ai-gemfire/README.md b/vector-stores/spring-ai-gemfire-store/README.md similarity index 100% rename from vector-stores/spring-ai-gemfire/README.md rename to vector-stores/spring-ai-gemfire-store/README.md diff --git a/vector-stores/spring-ai-gemfire/pom.xml b/vector-stores/spring-ai-gemfire-store/pom.xml similarity index 98% rename from vector-stores/spring-ai-gemfire/pom.xml rename to vector-stores/spring-ai-gemfire-store/pom.xml index 8b4e6407b..45f7e7163 100644 --- a/vector-stores/spring-ai-gemfire/pom.xml +++ b/vector-stores/spring-ai-gemfire-store/pom.xml @@ -8,7 +8,7 @@ 1.0.0-SNAPSHOT ../../pom.xml - spring-ai-gemfire + spring-ai-gemfire-store jar Spring AI Vector Store - GemFire Spring AI GemFire Vector Store diff --git a/vector-stores/spring-ai-gemfire/src/main/java/org/springframework/ai/vectorstore/GemFireVectorStore.java b/vector-stores/spring-ai-gemfire-store/src/main/java/org/springframework/ai/vectorstore/GemFireVectorStore.java similarity index 100% rename from vector-stores/spring-ai-gemfire/src/main/java/org/springframework/ai/vectorstore/GemFireVectorStore.java rename to vector-stores/spring-ai-gemfire-store/src/main/java/org/springframework/ai/vectorstore/GemFireVectorStore.java diff --git a/vector-stores/spring-ai-gemfire/src/test/java/org/springframework/ai/vectorstore/GemFireVectorStoreIT.java b/vector-stores/spring-ai-gemfire-store/src/test/java/org/springframework/ai/vectorstore/GemFireVectorStoreIT.java similarity index 100% rename from vector-stores/spring-ai-gemfire/src/test/java/org/springframework/ai/vectorstore/GemFireVectorStoreIT.java rename to vector-stores/spring-ai-gemfire-store/src/test/java/org/springframework/ai/vectorstore/GemFireVectorStoreIT.java diff --git a/vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/MilvusVectorStore.java b/vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/MilvusVectorStore.java index b86438b6c..0a6004a1c 100644 --- a/vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/MilvusVectorStore.java +++ b/vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/MilvusVectorStore.java @@ -55,16 +55,14 @@ import org.springframework.ai.document.Document; import org.springframework.ai.embedding.EmbeddingClient; import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; import org.springframework.ai.vectorstore.filter.converter.MilvusFilterExpressionConverter; -import org.springframework.boot.context.event.ApplicationReadyEvent; -import org.springframework.context.ApplicationListener; +import org.springframework.beans.factory.InitializingBean; import org.springframework.util.Assert; import org.springframework.util.StringUtils; /** * @author Christian Tzolov - * @author Josh Long */ -public class MilvusVectorStore implements VectorStore, ApplicationListener { +public class MilvusVectorStore implements VectorStore, InitializingBean { private static final Logger logger = LoggerFactory.getLogger(MilvusVectorStore.class); @@ -98,11 +96,6 @@ public class MilvusVectorStore implements VectorStore, ApplicationListener { +public class MongoDBAtlasVectorStore implements VectorStore, InitializingBean { public static final String ID_FIELD_NAME = "_id"; @@ -78,6 +76,16 @@ public class MongoDBAtlasVectorStore implements VectorStore, ApplicationListener } + @Override + public void afterPropertiesSet() throws Exception { + // Create the collection if it does not exist + if (!mongoTemplate.collectionExists(this.config.collectionName)) { + mongoTemplate.createCollection(this.config.collectionName); + } + // Create search index, command doesn't do anything if already existing + mongoTemplate.executeCommand(createSearchIndex()); + } + /** * Provides the Definition for the search index */ @@ -166,16 +174,6 @@ public class MongoDBAtlasVectorStore implements VectorStore, ApplicationListener .toList(); } - @Override - public void onApplicationEvent(ApplicationReadyEvent event) { - // Create the collection if it does not exist - if (!mongoTemplate.collectionExists(this.config.collectionName)) { - mongoTemplate.createCollection(this.config.collectionName); - } - // Create search index, command doesn't do anything if already existing - mongoTemplate.executeCommand(createSearchIndex()); - } - public static class MongoDBVectorStoreConfig { private final String collectionName; diff --git a/vector-stores/spring-ai-neo4j-store/src/main/java/org/springframework/ai/vectorstore/Neo4jVectorStore.java b/vector-stores/spring-ai-neo4j-store/src/main/java/org/springframework/ai/vectorstore/Neo4jVectorStore.java index 8b5b3024f..8ac8fd204 100644 --- a/vector-stores/spring-ai-neo4j-store/src/main/java/org/springframework/ai/vectorstore/Neo4jVectorStore.java +++ b/vector-stores/spring-ai-neo4j-store/src/main/java/org/springframework/ai/vectorstore/Neo4jVectorStore.java @@ -22,8 +22,7 @@ import org.neo4j.driver.Values; import org.springframework.ai.document.Document; import org.springframework.ai.embedding.EmbeddingClient; import org.springframework.ai.vectorstore.filter.Neo4jVectorFilterExpressionConverter; -import org.springframework.boot.context.event.ApplicationReadyEvent; -import org.springframework.context.ApplicationListener; +import org.springframework.beans.factory.InitializingBean; import org.springframework.util.Assert; import java.util.HashMap; @@ -35,9 +34,8 @@ import java.util.function.Predicate; /** * @author Gerrit Meier * @author Michael Simons - * @author Josh Long */ -public class Neo4jVectorStore implements VectorStore, ApplicationListener { +public class Neo4jVectorStore implements VectorStore, InitializingBean { /** * An enum to configure the distance function used in the Neo4j vector index. @@ -72,7 +70,6 @@ public class Neo4jVectorStore implements VectorStore, ApplicationListener documentToRecord(Document document) { var embedding = this.embeddingClient.embed(document); document.setEmbedding(embedding); @@ -416,4 +413,4 @@ public class Neo4jVectorStore implements VectorStore, ApplicationListener { +public class PgVectorStore implements VectorStore, InitializingBean { private static final Logger logger = LoggerFactory.getLogger(PgVectorStore.class); @@ -80,40 +78,6 @@ public class PgVectorStore implements VectorStore, ApplicationListener1.0.0-SNAPSHOT ../../pom.xml - spring-ai-pinecone + spring-ai-pinecone-store jar Spring AI Vector Store - Pinecone https://github.com/spring-projects/spring-ai diff --git a/vector-stores/spring-ai-pinecone/src/main/java/org/springframework/ai/vectorstore/PineconeVectorStore.java b/vector-stores/spring-ai-pinecone-store/src/main/java/org/springframework/ai/vectorstore/PineconeVectorStore.java similarity index 100% rename from vector-stores/spring-ai-pinecone/src/main/java/org/springframework/ai/vectorstore/PineconeVectorStore.java rename to vector-stores/spring-ai-pinecone-store/src/main/java/org/springframework/ai/vectorstore/PineconeVectorStore.java diff --git a/vector-stores/spring-ai-pinecone/src/test/java/org/springframework/ai/vectorstore/PineconeVectorStoreIT.java b/vector-stores/spring-ai-pinecone-store/src/test/java/org/springframework/ai/vectorstore/PineconeVectorStoreIT.java similarity index 100% rename from vector-stores/spring-ai-pinecone/src/test/java/org/springframework/ai/vectorstore/PineconeVectorStoreIT.java rename to vector-stores/spring-ai-pinecone-store/src/test/java/org/springframework/ai/vectorstore/PineconeVectorStoreIT.java diff --git a/vector-stores/spring-ai-qdrant/README.md b/vector-stores/spring-ai-qdrant-store/README.md similarity index 100% rename from vector-stores/spring-ai-qdrant/README.md rename to vector-stores/spring-ai-qdrant-store/README.md diff --git a/vector-stores/spring-ai-qdrant/pom.xml b/vector-stores/spring-ai-qdrant-store/pom.xml similarity index 98% rename from vector-stores/spring-ai-qdrant/pom.xml rename to vector-stores/spring-ai-qdrant-store/pom.xml index 77ec45ffa..df834e266 100644 --- a/vector-stores/spring-ai-qdrant/pom.xml +++ b/vector-stores/spring-ai-qdrant-store/pom.xml @@ -8,7 +8,7 @@ 1.0.0-SNAPSHOT ../../pom.xml - spring-ai-qdrant + spring-ai-qdrant-store jar Spring AI Vector Store - QDrant diff --git a/vector-stores/spring-ai-qdrant/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantFilterExpressionConverter.java b/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantFilterExpressionConverter.java similarity index 100% rename from vector-stores/spring-ai-qdrant/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantFilterExpressionConverter.java rename to vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantFilterExpressionConverter.java diff --git a/vector-stores/spring-ai-qdrant/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantObjectFactory.java b/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantObjectFactory.java similarity index 100% rename from vector-stores/spring-ai-qdrant/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantObjectFactory.java rename to vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantObjectFactory.java diff --git a/vector-stores/spring-ai-qdrant/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantValueFactory.java b/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantValueFactory.java similarity index 100% rename from vector-stores/spring-ai-qdrant/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantValueFactory.java rename to vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantValueFactory.java diff --git a/vector-stores/spring-ai-qdrant/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantVectorStore.java b/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantVectorStore.java similarity index 95% rename from vector-stores/spring-ai-qdrant/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantVectorStore.java rename to vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantVectorStore.java index 607a1ecb7..f9d3a250c 100644 --- a/vector-stores/spring-ai-qdrant/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantVectorStore.java +++ b/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantVectorStore.java @@ -15,12 +15,24 @@ */ package org.springframework.ai.vectorstore.qdrant; +import static io.qdrant.client.PointIdFactory.id; +import static io.qdrant.client.ValueFactory.value; +import static io.qdrant.client.VectorsFactory.vectors; +import static io.qdrant.client.WithPayloadSelectorFactory.enable; + import java.util.List; import java.util.Map; import java.util.Optional; import java.util.UUID; import java.util.concurrent.ExecutionException; +import org.springframework.ai.document.Document; +import org.springframework.ai.embedding.EmbeddingClient; +import org.springframework.ai.vectorstore.SearchRequest; +import org.springframework.ai.vectorstore.VectorStore; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.util.Assert; + import io.qdrant.client.QdrantClient; import io.qdrant.client.grpc.Collections.Distance; import io.qdrant.client.grpc.Collections.VectorParams; @@ -32,19 +44,6 @@ import io.qdrant.client.grpc.Points.ScoredPoint; import io.qdrant.client.grpc.Points.SearchPoints; import io.qdrant.client.grpc.Points.UpdateStatus; -import org.springframework.ai.document.Document; -import org.springframework.ai.embedding.EmbeddingClient; -import org.springframework.ai.vectorstore.SearchRequest; -import org.springframework.ai.vectorstore.VectorStore; -import org.springframework.boot.context.event.ApplicationReadyEvent; -import org.springframework.context.ApplicationListener; -import org.springframework.util.Assert; - -import static io.qdrant.client.PointIdFactory.id; -import static io.qdrant.client.ValueFactory.value; -import static io.qdrant.client.VectorsFactory.vectors; -import static io.qdrant.client.WithPayloadSelectorFactory.enable; - /** * Qdrant vectorStore implementation. This store supports creating, updating, deleting, * and similarity searching of documents in a Qdrant collection. @@ -52,10 +51,9 @@ import static io.qdrant.client.WithPayloadSelectorFactory.enable; * @author Anush Shetty * @author Christian Tzolov * @author Eddú Meléndez - * @author Josh Long * @since 0.8.1 */ -public class QdrantVectorStore implements VectorStore, ApplicationListener { +public class QdrantVectorStore implements VectorStore, InitializingBean { private static final String CONTENT_FIELD_NAME = "doc_content"; @@ -86,7 +84,6 @@ public class QdrantVectorStore implements VectorStore, ApplicationListener d.floatValue()).toList(); } + @Override + public void afterPropertiesSet() throws Exception { + // Create the collection if it does not exist. + if (!isCollectionExists()) { + var vectorParams = VectorParams.newBuilder() + .setDistance(Distance.Cosine) + .setSize(this.embeddingClient.dimensions()) + .build(); + this.qdrantClient.createCollectionAsync(this.collectionName, vectorParams).get(); + } + } + private boolean isCollectionExists() { try { return this.qdrantClient.listCollectionsAsync().get().stream().anyMatch(c -> c.equals(this.collectionName)); @@ -313,4 +305,4 @@ public class QdrantVectorStore implements VectorStore, ApplicationListener1.0.0-SNAPSHOT ../../pom.xml - spring-ai-redis + spring-ai-redis-store jar Spring AI Vector Store - Redis Spring AI Vector Store - Redis diff --git a/vector-stores/spring-ai-redis/src/main/java/org/springframework/ai/vectorstore/RedisFilterExpressionConverter.java b/vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/RedisFilterExpressionConverter.java similarity index 100% rename from vector-stores/spring-ai-redis/src/main/java/org/springframework/ai/vectorstore/RedisFilterExpressionConverter.java rename to vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/RedisFilterExpressionConverter.java diff --git a/vector-stores/spring-ai-redis/src/main/java/org/springframework/ai/vectorstore/RedisVectorStore.java b/vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/RedisVectorStore.java similarity index 97% rename from vector-stores/spring-ai-redis/src/main/java/org/springframework/ai/vectorstore/RedisVectorStore.java rename to vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/RedisVectorStore.java index 47982bf92..cb34e3b8b 100644 --- a/vector-stores/spring-ai-redis/src/main/java/org/springframework/ai/vectorstore/RedisVectorStore.java +++ b/vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/RedisVectorStore.java @@ -28,6 +28,13 @@ import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.ai.document.Document; +import org.springframework.ai.embedding.EmbeddingClient; +import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; + import redis.clients.jedis.JedisPooled; import redis.clients.jedis.Pipeline; import redis.clients.jedis.json.Path2; @@ -44,14 +51,6 @@ import redis.clients.jedis.search.schemafields.TextField; import redis.clients.jedis.search.schemafields.VectorField; import redis.clients.jedis.search.schemafields.VectorField.VectorAlgorithm; -import org.springframework.ai.document.Document; -import org.springframework.ai.embedding.EmbeddingClient; -import org.springframework.ai.vectorstore.filter.FilterExpressionConverter; -import org.springframework.boot.context.event.ApplicationReadyEvent; -import org.springframework.context.ApplicationListener; -import org.springframework.util.Assert; -import org.springframework.util.CollectionUtils; - /** * The RedisVectorStore is for managing and querying vector data in a Redis database. It * offers functionalities like adding, deleting, and performing similarity searches on @@ -69,27 +68,11 @@ import org.springframework.util.CollectionUtils; * * @author Julien Ruaux * @author Christian Tzolov - * @author Josh Long * @see VectorStore * @see RedisVectorStoreConfig * @see EmbeddingClient */ -public class RedisVectorStore implements VectorStore, ApplicationListener { - - @Override - public void onApplicationEvent(ApplicationReadyEvent event) { - // If index already exists don't do anything - if (this.jedis.ftList().contains(this.config.indexName)) { - return; - } - - String response = this.jedis.ftCreate(this.config.indexName, - FTCreateParams.createParams().on(IndexDataType.JSON).addPrefix(this.config.prefix), schemaFields()); - if (!RESPONSE_OK.test(response)) { - String message = MessageFormat.format("Could not create index: {0}", response); - throw new RuntimeException(message); - } - } +public class RedisVectorStore implements VectorStore, InitializingBean { public enum Algorithm { @@ -419,6 +402,22 @@ public class RedisVectorStore implements VectorStore, ApplicationListener schemaFields() { Map vectorAttrs = new HashMap<>(); vectorAttrs.put("DIM", this.embeddingClient.dimensions()); @@ -476,4 +475,4 @@ public class RedisVectorStore implements VectorStore, ApplicationListener