Skip to content

Commit c376630

Browse files
committed
fix to add metadata plus tests - Signed-off-by: Theo van Kraay <[email protected]>
Signed-off-by: Theo van Kraay <[email protected]>
1 parent 9a2f398 commit c376630

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBVectorStore.java

+19-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818

1919
import java.util.ArrayList;
2020
import java.util.Collections;
21+
import java.util.HashMap;
2122
import java.util.List;
23+
import java.util.Map;
2224
import java.util.Optional;
2325
import java.util.stream.Collectors;
2426
import java.util.stream.IntStream;
@@ -351,16 +353,32 @@ public List<Document> doSimilaritySearch(SearchRequest request) {
351353

352354
CosmosPagedFlux<JsonNode> pagedFlux = this.container.queryItems(sqlQuerySpec, options, JsonNode.class);
353355

356+
354357
logger.info("Executing similarity search query: {}", query);
355358
try {
356359
// Collect documents from the paged flux
357360
List<JsonNode> documents = pagedFlux.byPage()
358361
.flatMap(page -> Flux.fromIterable(page.getResults()))
359362
.collectList()
360363
.block();
364+
365+
// Collect metadata fields from the documents
366+
Map<String, Object> docFields = new HashMap<>();
367+
for (var doc : documents) {
368+
JsonNode metadata = doc.get("metadata");
369+
metadata.fieldNames().forEachRemaining(field -> {
370+
JsonNode value = metadata.get(field);
371+
Object parsedValue = value.isTextual() ? value.asText() :
372+
value.isNumber() ? value.numberValue() :
373+
value.isBoolean() ? value.booleanValue() :
374+
value.toString();
375+
docFields.put(field, parsedValue);
376+
});
377+
}
378+
361379
// Convert JsonNode to Document
362380
List<Document> docs = documents.stream()
363-
.map(doc -> Document.builder().id(doc.get("id").asText()).text(doc.get("content").asText()).build())
381+
.map(doc -> Document.builder().id(doc.get("id").asText()).text(doc.get("content").asText()).metadata(docFields).build())
364382
.collect(Collectors.toList());
365383

366384
return docs != null ? docs : List.of();

vector-stores/spring-ai-azure-cosmos-db-store/src/test/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBVectorStoreIT.java

+8
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,12 @@ void testSimilaritySearchWithFilter() {
141141

142142
assertThat(results).hasSize(2);
143143
assertThat(results).extracting(Document::getId).containsExactlyInAnyOrder("1", "2");
144+
for (Document doc : results) {
145+
assertThat(doc.getMetadata().get("country")).isIn("UK", "NL");
146+
assertThat(doc.getMetadata().get("year")).isIn(2021, 2022);
147+
assertThat(doc.getMetadata().get("city")).isIn("London", "Amsterdam")
148+
.isNotEqualTo("Sofia");
149+
}
144150

145151
List<Document> results2 = this.vectorStore.similaritySearch(SearchRequest.builder()
146152
.query("The World")
@@ -152,6 +158,8 @@ void testSimilaritySearchWithFilter() {
152158
assertThat(results2).hasSize(1);
153159
assertThat(results2).extracting(Document::getId).containsExactlyInAnyOrder("1");
154160

161+
162+
155163
List<Document> results3 = this.vectorStore.similaritySearch(SearchRequest.builder()
156164
.query("The World")
157165
.topK(10)

0 commit comments

Comments
 (0)