Skip to content

Commit 14a5b3d

Browse files
author
Milder Hernandez
authored
Merge pull request #220 from milderhc/redis-vector-search
Add vector search for Redis JSON and HashSet
2 parents e085f69 + 25f0630 commit 14a5b3d

File tree

20 files changed

+969
-192
lines changed

20 files changed

+969
-192
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.microsoft.semantickernel.tests.connectors.memory;
1+
package com.microsoft.semantickernel.tests.connectors.memory.jdbc;
22

33
import com.fasterxml.jackson.annotation.JsonCreator;
44
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -12,7 +12,7 @@ public class Hotel {
1212
@VectorStoreRecordKeyAttribute
1313
private final String id;
1414

15-
@VectorStoreRecordDataAttribute
15+
@VectorStoreRecordDataAttribute(isFilterable = true)
1616
private final String name;
1717

1818
@VectorStoreRecordDataAttribute

api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/connectors/memory/jdbc/JDBCVectorStoreRecordCollectionTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import com.microsoft.semantickernel.data.vectorsearch.VectorSearchResult;
1111
import com.microsoft.semantickernel.data.vectorstorage.options.GetRecordOptions;
1212
import com.microsoft.semantickernel.data.vectorstorage.options.VectorSearchOptions;
13-
import com.microsoft.semantickernel.tests.connectors.memory.Hotel;
1413
import com.mysql.cj.jdbc.MysqlDataSource;
1514
import org.junit.jupiter.api.Test;
1615
import org.junit.jupiter.params.ParameterizedTest;

api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/connectors/memory/jdbc/JDBCVectorStoreTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import com.microsoft.semantickernel.connectors.data.jdbc.JDBCVectorStoreRecordCollectionOptions;
77
import com.microsoft.semantickernel.connectors.data.mysql.MySQLVectorStoreQueryProvider;
88
import com.microsoft.semantickernel.connectors.data.postgres.PostgreSQLVectorStoreQueryProvider;
9-
import com.microsoft.semantickernel.tests.connectors.memory.Hotel;
109
import com.mysql.cj.jdbc.MysqlDataSource;
1110
import org.junit.jupiter.params.ParameterizedTest;
1211
import org.junit.jupiter.params.provider.EnumSource;
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package com.microsoft.semantickernel.tests.connectors.memory.redis;
2+
3+
import com.fasterxml.jackson.annotation.JsonCreator;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import com.microsoft.semantickernel.data.vectorstorage.attributes.VectorStoreRecordDataAttribute;
6+
import com.microsoft.semantickernel.data.vectorstorage.attributes.VectorStoreRecordKeyAttribute;
7+
import com.microsoft.semantickernel.data.vectorstorage.attributes.VectorStoreRecordVectorAttribute;
8+
9+
import java.util.List;
10+
11+
public class Hotel {
12+
@VectorStoreRecordKeyAttribute
13+
private final String id;
14+
15+
@VectorStoreRecordDataAttribute(isFilterable = true)
16+
private final String name;
17+
18+
@VectorStoreRecordDataAttribute
19+
private final int code;
20+
21+
@JsonProperty("summary")
22+
@VectorStoreRecordDataAttribute()
23+
private final String description;
24+
25+
@JsonProperty("summaryEmbedding1")
26+
@VectorStoreRecordVectorAttribute(dimensions = 8, distanceFunction = "euclidean")
27+
private final List<Float> euclidean;
28+
29+
@JsonProperty("summaryEmbedding2")
30+
@VectorStoreRecordVectorAttribute(dimensions = 8, distanceFunction = "cosineDistance")
31+
private final List<Float> cosineDistance;
32+
33+
@JsonProperty("summaryEmbedding3")
34+
@VectorStoreRecordVectorAttribute(dimensions = 8, distanceFunction = "dotProduct")
35+
private final List<Float> dotProduct;
36+
@VectorStoreRecordDataAttribute
37+
private double rating;
38+
39+
public Hotel() {
40+
this(null, null, 0, null, null, null, null, 0.0);
41+
}
42+
43+
@JsonCreator
44+
public Hotel(
45+
@JsonProperty("id") String id,
46+
@JsonProperty("name") String name,
47+
@JsonProperty("code") int code,
48+
@JsonProperty("summary") String description,
49+
@JsonProperty("summaryEmbedding1") List<Float> euclidean,
50+
@JsonProperty("summaryEmbedding2") List<Float> cosineDistance,
51+
@JsonProperty("summaryEmbedding3") List<Float> dotProduct,
52+
@JsonProperty("rating") double rating) {
53+
this.id = id;
54+
this.name = name;
55+
this.code = code;
56+
this.description = description;
57+
this.euclidean = euclidean;
58+
this.cosineDistance = euclidean;
59+
this.dotProduct = euclidean;
60+
this.rating = rating;
61+
}
62+
63+
public String getId() {
64+
return id;
65+
}
66+
67+
public String getName() {
68+
return name;
69+
}
70+
71+
public int getCode() {
72+
return code;
73+
}
74+
75+
public String getDescription() {
76+
return description;
77+
}
78+
79+
public List<Float> getEuclidean() {
80+
return euclidean;
81+
}
82+
83+
public List<Float> getCosineDistance() {
84+
return cosineDistance;
85+
}
86+
87+
public List<Float> getDotProduct() {
88+
return dotProduct;
89+
}
90+
91+
public double getRating() {
92+
return rating;
93+
}
94+
95+
public void setRating(double rating) {
96+
this.rating = rating;
97+
}
98+
}

api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/connectors/memory/redis/RedisHashSetVectorStoreRecordCollectionTest.java

Lines changed: 146 additions & 32 deletions
Large diffs are not rendered by default.

api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/connectors/memory/redis/RedisJsonVectorStoreRecordCollectionTest.java

Lines changed: 146 additions & 33 deletions
Large diffs are not rendered by default.

api-test/integration-tests/src/test/java/com/microsoft/semantickernel/tests/connectors/memory/redis/RedisVectorStoreTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import com.microsoft.semantickernel.connectors.data.redis.RedisVectorStore;
77
import com.microsoft.semantickernel.connectors.data.redis.RedisVectorStoreOptions;
88
import com.microsoft.semantickernel.data.vectorstorage.VectorStoreRecordCollectionOptions;
9-
import com.microsoft.semantickernel.tests.connectors.memory.Hotel;
9+
import com.microsoft.semantickernel.tests.connectors.memory.jdbc.Hotel;
1010
import com.redis.testcontainers.RedisContainer;
1111
import org.junit.jupiter.params.ParameterizedTest;
1212
import org.junit.jupiter.params.provider.EnumSource;

connectors/semantickernel-connectors-memory-redis/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
<dependency>
4242
<groupId>redis.clients</groupId>
4343
<artifactId>jedis</artifactId>
44-
<version>5.1.0</version>
44+
<version>5.2.0-beta5</version>
4545
<scope>provided</scope>
4646
</dependency>
4747
<dependency>

samples/semantickernel-concepts/semantickernel-syntax-examples/src/main/java/com/microsoft/semantickernel/samples/syntaxexamples/memory/AzureAISearchVectorStore.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -118,17 +118,19 @@ public static void dataStorageWithAzureAISearch(
118118
OpenAITextEmbeddingGenerationService embeddingGeneration) {
119119

120120
// Create a new Azure AI Search vector store
121-
var azureAISearchVectorStore = com.microsoft.semantickernel.connectors.data.azureaisearch.AzureAISearchVectorStore.builder()
121+
var azureAISearchVectorStore = com.microsoft.semantickernel.connectors.data.azureaisearch.AzureAISearchVectorStore
122+
.builder()
122123
.withSearchIndexAsyncClient(searchClient)
123124
.withOptions(new AzureAISearchVectorStoreOptions())
124125
.build();
125126

126127
String collectionName = "skgithubfiles";
127-
var collection = (AzureAISearchVectorStoreRecordCollection<GitHubFile>) azureAISearchVectorStore.getCollection(
128-
collectionName,
129-
AzureAISearchVectorStoreRecordCollectionOptions.<GitHubFile>builder()
130-
.withRecordClass(GitHubFile.class)
131-
.build());
128+
var collection = (AzureAISearchVectorStoreRecordCollection<GitHubFile>) azureAISearchVectorStore
129+
.getCollection(
130+
collectionName,
131+
AzureAISearchVectorStoreRecordCollectionOptions.<GitHubFile>builder()
132+
.withRecordClass(GitHubFile.class)
133+
.build());
132134

133135
// Create collection if it does not exist and store data
134136
collection
@@ -146,17 +148,17 @@ public static void dataStorageWithAzureAISearch(
146148
}
147149
var searchResult = results.get(0);
148150
System.out.printf("Search result with score: %f.%n Link: %s, Description: %s%n",
149-
searchResult.getScore(), searchResult.getRecord().link, searchResult.getRecord().description);
151+
searchResult.getScore(), searchResult.getRecord().link,
152+
searchResult.getRecord().description);
150153
}
151154

152-
153155
private static Mono<List<VectorSearchResult<GitHubFile>>> search(
154-
String searchText,
155-
AzureAISearchVectorStoreRecordCollection<GitHubFile> recordCollection,
156-
OpenAITextEmbeddingGenerationService embeddingGeneration) {
156+
String searchText,
157+
AzureAISearchVectorStoreRecordCollection<GitHubFile> recordCollection,
158+
OpenAITextEmbeddingGenerationService embeddingGeneration) {
157159

158160
return embeddingGeneration.generateEmbeddingsAsync(Collections.singletonList(searchText))
159-
.flatMap(r -> recordCollection.searchAsync(r.get(0).getVector(), null));
161+
.flatMap(r -> recordCollection.searchAsync(r.get(0).getVector(), null));
160162
}
161163

162164
private static Mono<List<String>> storeData(

semantickernel-bom/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@
120120
<dependency>
121121
<groupId>redis.clients</groupId>
122122
<artifactId>jedis</artifactId>
123-
<version>5.1.0</version>
123+
<version>5.2.0-beta5</version>
124124
</dependency>
125125

126126
<dependency>

0 commit comments

Comments
 (0)