diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/elasticsearch.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/elasticsearch.adoc index 23f323a50..aff84683c 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/elasticsearch.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/elasticsearch.adoc @@ -37,33 +37,12 @@ dependencies { TIP: Refer to the xref:getting-started.adoc#dependency-management[Dependency Management] section to add the Spring AI BOM to your build file. +TIP: Refer to the xref:getting-started.adoc#repositories[Repositories] section to add Milestone and/or Snapshot Repositories to your build file. + Please have a look at the list of <> for the vector store to learn about the default values and configuration options. -Here is an example of the needed bean: +Additionally, you will need a configured `EmbeddingClient` bean. Refer to the xref:api/embeddings.adoc#available-implementations[EmbeddingClient] section for more information. -[source,java] ----- -@Bean -public EmbeddingClient embeddingCLient() { - // Can be any other EmbeddingClient implementation - return new OpenAiEmbeddingClient(new OpenAiApi(System.getenv("SPRING_AI_OPENAI_API_KEY"))); -} ----- - -In cases where the Spring Boot auto-configured Elasticsearch `RestClient` bean is not what you want or need, you can still define your own bean. -Please read the link:https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/java-rest-low-usage-initialization.html[Elasticsearch Documentation] -for more in-depth information about the configuration of a custom RestClient. - -[source,java] ----- -@Bean -public RestClient restClienbt() { - RestClientBuilder builder = RestClient.builder(new HttpHost("", 9200, "http")); - Header[] defaultHeaders = new Header[] { new BasicHeader("Authorization", "Basic ") }; - builder.setDefaultHeaders(defaultHeaders); - return builder.build(); -} ----- Now you can auto-wire the `ElasticsearchVectorStore` as a vector store in your application. @@ -128,20 +107,19 @@ The Spring Boot properties starting with `spring.elasticsearch.*` are used to co |=== |Property | Description | Default Value -| spring.elasticsearch.connection-timeout | Connection timeout used when communicating with Elasticsearch. | 1s -| spring.elasticsearch.password | Password for authentication with Elasticsearch. | - -| spring.elasticsearch.username | Username for authentication with Elasticsearch.| - -| spring.elasticsearch.path-prefix | Prefix added to the path of every request sent to Elasticsearch. | - -| spring.elasticsearch.restclient.sniffer.delay-after-failure | Delay of a sniff execution scheduled after a failure.| 1m -| spring.elasticsearch.restclient.sniffer.interval | Interval between consecutive ordinary sniff executions. | 5m -| spring.elasticsearch.restclient.ssl.bundle | SSL bundle name. | - -| spring.elasticsearch.socket-keep-alive | Whether to enable socket keep alive between client and Elasticsearch. | false -| spring.elasticsearch.socket-timeout | Socket timeout used when communicating with Elasticsearch. | 30s -| spring.elasticsearch.uris | Comma-separated list of the Elasticsearch instances to use. | http://localhost:9200 +| `spring.elasticsearch.connection-timeout` | Connection timeout used when communicating with Elasticsearch. | `1s` +| `spring.elasticsearch.password` | Password for authentication with Elasticsearch. | - +| `spring.elasticsearch.username` | Username for authentication with Elasticsearch.| - +| `spring.elasticsearch.uris` | Comma-separated list of the Elasticsearch instances to use. | `http://localhost:9200` +| `spring.elasticsearch.path-prefix` | Prefix added to the path of every request sent to Elasticsearch. | - +| `spring.elasticsearch.restclient.sniffer.delay-after-failure` | Delay of a sniff execution scheduled after a failure.| `1m` +| `spring.elasticsearch.restclient.sniffer.interval` | Interval between consecutive ordinary sniff executions. | `5m` +| `spring.elasticsearch.restclient.ssl.bundle` | SSL bundle name. | - +| `spring.elasticsearch.socket-keep-alive` | Whether to enable socket keep alive between client and Elasticsearch. | `false` +| `spring.elasticsearch.socket-timeout` | Socket timeout used when communicating with Elasticsearch. | `30s` |=== - -The properties with `spring.ai.vectorstore.elasticsearch.*` prefix help to configure Elasticsearch vector store. +Properties starting with the `spring.ai.vectorstore.elasticsearch.*` prefix are used to configure `ElasticsearchVectorStore`. |=== |Property | Description | Default Value @@ -152,30 +130,9 @@ The properties with `spring.ai.vectorstore.elasticsearch.*` prefix help to confi |`spring.ai.vectorstore.elasticsearch.similarity` | The similarity function to use. | `cosine` |=== -=== Manual Configuration - -Instead of using the Spring Boot auto-configuration, you can manually configure the Elasticsearch vector store. \For this you need to add the `spring-ai-elasticsearch-store` to your project: - -[source,xml] ----- - - org.springframework.ai - spring-ai-elasticsearch-store - ----- - -or to your Gradle `build.gradle` build file. - -[source,groovy] ----- -dependencies { - implementation 'org.springframework.ai:spring-ai-elasticsearch-store' -} ----- - == Metadata Filtering -You can leverage the generic, portable xref:api/vectordbs.adoc#metadata-filters[metadata filters] with Elasticsearcg as well. +You can leverage the generic, portable xref:api/vectordbs.adoc#metadata-filters[metadata filters] with Elasticsearch as well. For example, you can use either the text expression language: @@ -219,3 +176,55 @@ is converted into the proprietary Elasticsearch filter format: (metadata.author:john OR jill) AND metadata.article_type:blog ---- +== Manual Configuration + +Instead of using the Spring Boot auto-configuration, you can manually configure the Elasticsearch vector store. \For this you need to add the `spring-ai-elasticsearch-store` to your project: + +[source,xml] +---- + + org.springframework.ai + spring-ai-elasticsearch-store + +---- + +or to your Gradle `build.gradle` build file. + +[source,groovy] +---- +dependencies { + implementation 'org.springframework.ai:spring-ai-elasticsearch-store' +} +---- + + +Create an Elasticsearch `RestClient` bean. +Read the link:https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/java-rest-low-usage-initialization.html[Elasticsearch Documentation] for more in-depth information about the configuration of a custom RestClient. + +[source,java] +---- +@Bean +public RestClient restClient() { + RestClientBuilder builder = RestClient.builder(new HttpHost("", 9200, "http")); + Header[] defaultHeaders = new Header[] { new BasicHeader("Authorization", "Basic ") }; + builder.setDefaultHeaders(defaultHeaders); + return builder.build(); +} +---- + +and then create the `ElasticsearchVectorStore` bean: + +[source,java] +---- +@Bean +public ElasticsearchVectorStore vectorStore(EmbeddingClient embeddingClient, RestClient restClient) { + return new ElasticsearchVectorStore( restClient, embeddingClient); +} + +// This can be any EmbeddingClient implementation. +@Bean +public EmbeddingClient embeddingClient() { + return new OpenAiEmbeddingClient(new OpenAiApi(System.getenv("OPENAI_API_KEY"))); +} +---- + 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 57794bd42..df614dbdb 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 @@ -16,6 +16,7 @@ package org.springframework.ai.autoconfigure.vectorstore.elasticsearch; import org.elasticsearch.client.RestClient; + import org.springframework.ai.embedding.EmbeddingClient; import org.springframework.ai.vectorstore.ElasticsearchVectorStore; import org.springframework.ai.vectorstore.ElasticsearchVectorStoreOptions; @@ -32,6 +33,7 @@ import org.springframework.util.StringUtils; * @author Wei Jiang * @since 1.0.0 */ + @AutoConfiguration(after = ElasticsearchRestClientAutoConfiguration.class) @ConditionalOnClass({ ElasticsearchVectorStore.class, EmbeddingClient.class, RestClient.class }) @EnableConfigurationProperties(ElasticsearchVectorStoreProperties.class)