Skip to content

Commit 6b74042

Browse files
committed
ready for release
1 parent e2c424f commit 6b74042

File tree

6 files changed

+279
-17
lines changed

6 files changed

+279
-17
lines changed

astra-db-java/src/main/java/com/datastax/astra/client/core/query/Sort.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,4 +251,22 @@ public static Sort hybrid(String hybrid) {
251251
.build();
252252
}
253253

254+
/**
255+
* Build a sort clause with vectorize.
256+
*
257+
* @param vectorize
258+
* vectorize information
259+
* @param lexical
260+
* lexical information
261+
*
262+
* @return
263+
* sort instance.
264+
*/
265+
public static Sort hybrid(String vectorize, String lexical) {
266+
return internalBuilder()
267+
.field(DataAPIKeywords.HYBRID.getKeyword())
268+
.hybrid(new Hybrid().vectorize(vectorize).lexical(lexical))
269+
.build();
270+
}
271+
254272
}

astra-db-java/src/test/java/com/datastax/astra/test/integration/astra/DemoAstraDevFindAndRerank.java

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,24 +36,23 @@
3636

3737
import static com.datastax.astra.client.DataAPIDestination.ASTRA_DEV;
3838
import static com.datastax.astra.client.core.lexical.AnalyzerTypes.STANDARD;
39+
import static com.dtsx.astra.sdk.db.domain.CloudProviderType.AWS;
3940
import static com.dtsx.astra.sdk.db.domain.CloudProviderType.GCP;
4041

4142
@Slf4j
4243
public class DemoAstraDevFindAndRerank {
4344

44-
public static final String ASTRA_DB_TOKEN = System.getenv("ASTRA_DB_APPLICATION_TOKEN_DEV");
45-
public static final String DATABASE_DEMO_NAME = "demo_charter";
46-
47-
public static final String ASTRA_DB_ENDPOINT = "https://9e0ff165-666d-4a69-b5b7-727d6cd77092-us-central1.apps.astra-dev.datastax.com";
45+
public static final String ASTRA_DB_TOKEN = System.getenv("ASTRA_DB_APPLICATION_TOKEN");
46+
public static final String DATABASE_DEMO_NAME = "test_farr";
4847
public static final String OPEN_API_KEY = System.getenv("OPENAI_API_KEY");
4948

5049
/**
5150
* Create a DataAPIClient for Astra DEV.
5251
*/
5352
private DataAPIClient getDataApiClient() {
5453
DataAPIClientOptions options = new DataAPIClientOptions()
55-
.destination(ASTRA_DEV)
56-
.rerankAPIKey(ASTRA_DB_TOKEN)
54+
//.destination(ASTRA_DEV)
55+
//.rerankAPIKey(ASTRA_DB_TOKEN)
5756
.embeddingAPIKey(OPEN_API_KEY)
5857
.logRequests();
5958
return new DataAPIClient(ASTRA_DB_TOKEN, options);
@@ -65,7 +64,7 @@ private DataAPIClient getDataApiClient() {
6564
private Database getDatabase() {
6665
// Alternatively, you can use the following code to get the database:
6766
return getDataApiClient().getAdmin()
68-
.createDatabase(DATABASE_DEMO_NAME, GCP, "us-central1")
67+
.createDatabase(DATABASE_DEMO_NAME, AWS, "us-east-2")
6968
.getDatabase();
7069
//return getDataApiClient().getDatabase(ASTRA_DB_ENDPOINT);
7170
}
@@ -184,12 +183,7 @@ public void should_populate_collection() throws IOException {
184183
public void should_run_find_and_rerank() throws IOException {
185184
CollectionFindAndRerankOptions farrOptions = new CollectionFindAndRerankOptions()
186185
.projection(Projection.include("$vectorize", "_id", "quote", "author"))
187-
188-
189186
.sort(Sort.hybrid(new Hybrid("We struggle all in life")))
190-
191-
192-
193187
.rerankingAuthProvider(new RerankingAPIKeyHeaderProvider(ASTRA_DB_TOKEN))
194188
.embeddingAuthProvider(new EmbeddingAPIKeyHeaderProvider(ASTRA_DB_TOKEN))
195189
.includeScores(true)
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package com.datastax.astra.client.collections.findrerank;
2+
3+
import com.datastax.astra.client.DataAPIClient;
4+
import com.datastax.astra.client.admin.DatabaseAdmin;
5+
import com.datastax.astra.client.databases.Database;
6+
import com.datastax.astra.client.databases.commands.results.FindRerankingProvidersResult;
7+
8+
public class FindRerankerProvidesr {
9+
10+
public static void main(String[] args) {
11+
Database db = new DataAPIClient("TOKEN")
12+
.getDatabase("API_ENDPOINT");
13+
14+
DatabaseAdmin dbAdmin = db
15+
.getDatabaseAdmin();
16+
17+
FindRerankingProvidersResult results = dbAdmin
18+
.findRerankingProviders();
19+
20+
results.getRerankingProviders().forEach((name, provider) -> {;
21+
System.out.println("Provider: " + name);
22+
System.out.println("Display Name: " + provider.getDisplayName());
23+
System.out.println("Is Default: " + provider.getIsDefault());
24+
System.out.println("Parameters: " + provider.getParameters());
25+
System.out.println("Supported Authentication: " + provider.getSupportedAuthentication());
26+
System.out.println("Models: " + provider.getModels());
27+
});
28+
29+
}
30+
31+
/*
32+
import { DataAPIClient } from '@datastax/astra-db-ts'
33+
34+
// Spawn an AstraDbAdmin instance
35+
const admin = new DataAPIClient('**TOKEN**').admin();
36+
const dbAdmin = admin.dbAdmin('**ENDPOINT**');
37+
38+
(async function () {
39+
const { rerankingProviders: info } = await dbAdmin.findRerankingProviders();
40+
41+
// { nvidia: { ... }, ... }
42+
console.log(info);
43+
44+
// ['nvidia', ...]
45+
console.log(Object.keys(info))
46+
47+
// { displayName: 'Nvidia', models: [...], ... }
48+
console.log(info.nvidia);
49+
50+
// 'Nvidia'
51+
console.log(info.nvidia.displayName);
52+
53+
// true
54+
console.log(info.nvidia.isDefault);
55+
56+
// []
57+
console.log(info.nvidia.parameters);
58+
59+
// { NONE: { enabled: true, ... } }
60+
console.log(info.nvidia.supportedAuthentication);
61+
62+
// { name: 'nvidia/llama-3.2-nv-rerankqa-1b-v2', parameters: [] }
63+
console.log(info.nvidia.models[0]);
64+
65+
// true
66+
console.log(info.nvidia.models[0].isDefault);
67+
68+
// []
69+
console.log(info.nvidia.models[0].parameters);
70+
})();
71+
72+
*/
73+
}
74+
75+
76+
/*
77+
// With Vectorize
78+
for (RerankedResult<Document> results : collection
79+
.findAndRerank(new CollectionFindAndRerankOptions()
80+
.sort(Sort.hybrid("A tree on a hill")))) {
81+
System.out.println(results.getDocument());
82+
}
83+
84+
// Without Vectorize
85+
Hybrid hybrid = new Hybrid()
86+
.vector(new float[]{0.25f, 0.25f, 0.25f, 0.25f, 0.25f})
87+
.lexical("A tree on a hill");
88+
for (RerankedResult<Document> results : collection
89+
.findAndRerank(new CollectionFindAndRerankOptions()
90+
.sort(Sort.hybrid(hybrid))
91+
.rerankOn("$lexical")
92+
.rerankQuery("A house in the woods"))) {
93+
System.out.println(results.getDocument());
94+
}
95+
96+
// Use a different query in the reranking step
97+
Hybrid hybrid2 = new Hybrid()
98+
.vector(new DataAPIVector(new float[]{0.25f, 0.25f, 0.25f, 0.25f, 0.25f}))
99+
.lexical("lexical query");
100+
for (RerankedResult<Document> results : collection
101+
.findAndRerank(new CollectionFindAndRerankOptions()
102+
.sort(Sort.hybrid(hybrid2))
103+
.rerankOn("$lexical")
104+
.rerankQuery("A house in the woods"))) {
105+
System.out.println(results.getDocument());
106+
}
107+
108+
// Use Filters
109+
Filter filter = Filters.and(
110+
Filters.eq("isCheckedOut", false),
111+
Filters.lt("numberOfPages", 300)
112+
);
113+
*/
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.datastax.astra.client.collections.findrerank;
2+
3+
import com.datastax.astra.client.DataAPIClient;
4+
import com.datastax.astra.client.collections.Collection;
5+
import com.datastax.astra.client.collections.definition.documents.Document;
6+
import com.datastax.astra.client.core.hybrid.Hybrid;
7+
8+
public class InsertMany {
9+
10+
public static void main(String[] args) {
11+
Collection<Document> collection = new DataAPIClient("TOKEN")
12+
.getDatabase("API_ENDPOINT")
13+
.getCollection("COLLECTION_NAME");
14+
15+
Document doc1 = new Document().append("name", "John Doe")
16+
.vector(new float[]{0.25f, 0.25f, 0.25f, 0.25f, 0.25f})
17+
.lexical("Text for lexical search");
18+
Document doc2 = new Document().append("name", "Mary Day")
19+
.vector(new float[]{0.25f, 0.25f, 0.25f, 0.25f, 0.25f})
20+
.lexical("Text for vector search");
21+
Document doc3 = new Document().append("name", "'Bobby'")
22+
.hybrid(new Hybrid("Common text for both vectorize and lexical search"));
23+
collection.insertMany(doc1, doc2, doc3);
24+
}
25+
}
26+
27+
28+
/*
29+
// With Vectorize
30+
for (RerankedResult<Document> results : collection
31+
.findAndRerank(new CollectionFindAndRerankOptions()
32+
.sort(Sort.hybrid("A tree on a hill")))) {
33+
System.out.println(results.getDocument());
34+
}
35+
36+
// Without Vectorize
37+
Hybrid hybrid = new Hybrid()
38+
.vector(new float[]{0.25f, 0.25f, 0.25f, 0.25f, 0.25f})
39+
.lexical("A tree on a hill");
40+
for (RerankedResult<Document> results : collection
41+
.findAndRerank(new CollectionFindAndRerankOptions()
42+
.sort(Sort.hybrid(hybrid))
43+
.rerankOn("$lexical")
44+
.rerankQuery("A house in the woods"))) {
45+
System.out.println(results.getDocument());
46+
}
47+
48+
// Use a different query in the reranking step
49+
Hybrid hybrid2 = new Hybrid()
50+
.vector(new DataAPIVector(new float[]{0.25f, 0.25f, 0.25f, 0.25f, 0.25f}))
51+
.lexical("lexical query");
52+
for (RerankedResult<Document> results : collection
53+
.findAndRerank(new CollectionFindAndRerankOptions()
54+
.sort(Sort.hybrid(hybrid2))
55+
.rerankOn("$lexical")
56+
.rerankQuery("A house in the woods"))) {
57+
System.out.println(results.getDocument());
58+
}
59+
60+
// Use Filters
61+
Filter filter = Filters.and(
62+
Filters.eq("isCheckedOut", false),
63+
Filters.lt("numberOfPages", 300)
64+
);
65+
*/

examples/src/main/java/com/datastax/astra/client/collections/findrerank/SampleFind.java renamed to examples/src/main/java/com/datastax/astra/client/collections/findrerank/SampleWithVectorize.java

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,29 @@
44
import com.datastax.astra.client.collections.Collection;
55
import com.datastax.astra.client.collections.commands.options.CollectionFindAndRerankOptions;
66
import com.datastax.astra.client.collections.definition.documents.Document;
7-
import com.datastax.astra.client.core.hybrid.Hybrid;
87
import com.datastax.astra.client.core.query.Sort;
98
import com.datastax.astra.client.core.rerank.RerankedResult;
109

11-
public class SampleFind {
10+
import java.util.Map;
11+
12+
public class SampleWithVectorize {
1213

1314
public static void main(String[] args) {
1415
Collection<Document> collection = new DataAPIClient("TOKEN")
1516
.getDatabase("API_ENDPOINT")
1617
.getCollection("COLLECTION_NAME");
18+
for (RerankedResult<Document> results : collection
19+
.findAndRerank(new CollectionFindAndRerankOptions()
20+
.sort(Sort.hybrid("query text"))
21+
.hybridLimits(Map.of("$vector", 8, "$lexical", 20)))) {
22+
System.out.println(results.getDocument());
23+
}
24+
}
25+
}
1726

18-
// With Vectorize
27+
28+
/*
29+
// With Vectorize
1930
for (RerankedResult<Document> results : collection
2031
.findAndRerank(new CollectionFindAndRerankOptions()
2132
.sort(Sort.hybrid("A tree on a hill")))) {
@@ -35,5 +46,20 @@ public static void main(String[] args) {
3546
}
3647
3748
// Use a different query in the reranking step
38-
}
39-
}
49+
Hybrid hybrid2 = new Hybrid()
50+
.vector(new DataAPIVector(new float[]{0.25f, 0.25f, 0.25f, 0.25f, 0.25f}))
51+
.lexical("lexical query");
52+
for (RerankedResult<Document> results : collection
53+
.findAndRerank(new CollectionFindAndRerankOptions()
54+
.sort(Sort.hybrid(hybrid2))
55+
.rerankOn("$lexical")
56+
.rerankQuery("A house in the woods"))) {
57+
System.out.println(results.getDocument());
58+
}
59+
60+
// Use Filters
61+
Filter filter = Filters.and(
62+
Filters.eq("isCheckedOut", false),
63+
Filters.lt("numberOfPages", 300)
64+
);
65+
*/
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.datastax.astra.client.collections.findrerank;
2+
3+
import com.datastax.astra.client.DataAPIClient;
4+
import com.datastax.astra.client.collections.Collection;
5+
import com.datastax.astra.client.collections.commands.cursor.CollectionFindAndRerankCursor;
6+
import com.datastax.astra.client.collections.commands.options.CollectionFindAndRerankOptions;
7+
import com.datastax.astra.client.collections.definition.documents.Document;
8+
import com.datastax.astra.client.core.hybrid.Hybrid;
9+
import com.datastax.astra.client.core.query.Filter;
10+
import com.datastax.astra.client.core.query.Projection;
11+
import com.datastax.astra.client.core.query.Sort;
12+
import com.datastax.astra.client.core.rerank.RerankedResult;
13+
import lombok.Data;
14+
15+
public class SampleWithoutVectorize {
16+
17+
@Data
18+
public static class Projected {
19+
boolean isCheckedOut;
20+
String title;
21+
}
22+
23+
public static void main(String[] args) {
24+
Collection<Document> collection = new DataAPIClient("TOKEN")
25+
.getDatabase("API_ENDPOINT")
26+
.getCollection("COLLECTION_NAME");
27+
Hybrid hybrid = new Hybrid()
28+
.vector(new float[]{0.25f, 0.25f, 0.25f, 0.25f, 0.25f})
29+
.lexical("lexical query");
30+
31+
Filter filter = null;
32+
CollectionFindAndRerankCursor<Document, Projected> cursor = collection
33+
.findAndRerank(filter, new CollectionFindAndRerankOptions()
34+
.projection(Projection.include("isCheckedOut", "title"))
35+
.sort(Sort.hybrid(hybrid))
36+
.rerankQuery("rerank query")
37+
.rerankOn("$lexical"), Projected.class);
38+
39+
// note he projection can also done at the cursor level
40+
//cursor.project(Projection.include("isCheckedOut", "title"));
41+
42+
for (RerankedResult<Projected> results : cursor) {
43+
// Limit the number of properties resulted
44+
}
45+
}
46+
}

0 commit comments

Comments
 (0)