From c9ec39e370702ba077ec268e3973cb672f2c5fc7 Mon Sep 17 00:00:00 2001 From: Ilayaperumal Gopinathan Date: Thu, 12 Jun 2025 11:41:18 +0100 Subject: [PATCH] Fix ElasticsearchVectorStore to parse similarity option correctly - Check for valid DenseVectorSimilarity by using DenseVectorSimilarity's jsonValue with SimilarityFunction string - Update elasticsearch image elasticsearch:8.18.1 Signed-off-by: Ilayaperumal Gopinathan --- .../ElasticsearchVectorStore.java | 18 ++++++++++++++---- .../elasticsearch/ElasticsearchImage.java | 3 +-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchVectorStore.java b/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchVectorStore.java index f58479b9c..06f0ba38a 100644 --- a/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchVectorStore.java +++ b/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchVectorStore.java @@ -329,16 +329,26 @@ public class ElasticsearchVectorStore extends AbstractObservationVectorStore imp try { this.elasticsearchClient.indices() .create(cr -> cr.index(this.options.getIndexName()) - .mappings(map -> map.properties(this.options.getEmbeddingFieldName(), - p -> p.denseVector(dv -> dv - .similarity(DenseVectorSimilarity.valueOf(this.options.getSimilarity().toString())) - .dims(this.options.getDimensions()))))); + .mappings( + map -> map.properties(this.options.getEmbeddingFieldName(), + p -> p.denseVector(dv -> dv + .similarity(parseSimilarity(this.options.getSimilarity().toString())) + .dims(this.options.getDimensions()))))); } catch (IOException e) { throw new RuntimeException(e); } } + private DenseVectorSimilarity parseSimilarity(String similarity) { + for (DenseVectorSimilarity sim : DenseVectorSimilarity.values()) { + if (sim.jsonValue().equalsIgnoreCase(similarity)) { + return sim; + } + } + throw new IllegalArgumentException("Unsupported similarity: " + similarity); + } + @Override public void afterPropertiesSet() { if (!this.initializeSchema) { diff --git a/vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchImage.java b/vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchImage.java index 4af1decdc..a4f82c04d 100644 --- a/vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchImage.java +++ b/vector-stores/spring-ai-elasticsearch-store/src/test/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchImage.java @@ -23,8 +23,7 @@ import org.testcontainers.utility.DockerImageName; */ public final class ElasticsearchImage { - public static final DockerImageName DEFAULT_IMAGE = DockerImageName - .parse("docker.elastic.co/elasticsearch/elasticsearch:8.16.1"); + public static final DockerImageName DEFAULT_IMAGE = DockerImageName.parse("elasticsearch:8.18.1"); private ElasticsearchImage() {