-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest-sample-batch.ts
More file actions
164 lines (147 loc) · 4.87 KB
/
test-sample-batch.ts
File metadata and controls
164 lines (147 loc) · 4.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
import { Client } from './src/client';
import { Collection } from './src/collection';
import { Index } from './src/index';
import { Transaction, Vector } from './src/transaction';
// Configure logging
const logger = {
info: (message: string) => console.log(`[INFO] ${message}`),
error: (message: string, error?: any) => console.error(`[ERROR] ${message}`, error ? error : '')
};
/**
* Generate a random vector of the specified dimension.
*/
function generateRandomVector(dimension: number): number[] {
const vector: number[] = [];
for (let i = 0; i < dimension; i++) {
vector.push(Math.random() * 2 - 1); // Random value between -1 and 1
}
return vector;
}
/**
* Create a test collection with the specified parameters.
*/
async function createTestCollection(client: Client, name: string, dimension: number): Promise<Collection> {
logger.info(`Creating collection: ${name}`);
return client.createCollection({
name,
dimension,
description: "Test collection for batch operations"
});
}
/**
* Create a test index for the collection.
*/
async function createTestIndex(collection: Collection, name: string): Promise<Index> {
logger.info(`Creating index: ${name}`);
return collection.createIndex({
name,
distance_metric: "cosine",
num_layers: 7,
max_cache_size: 1000,
ef_construction: 512,
ef_search: 256,
neighbors_count: 32,
level_0_neighbors_count: 64
});
}
/**
* Generate test vectors.
*/
function generateTestVectors(numVectors: number, dimension: number): Vector[] {
logger.info(`Generating ${numVectors} test vectors`);
const vectors: Vector[] = [];
for (let i = 0; i < numVectors; i++) {
const vectorId = `vec_${i + 1}`;
const denseValues = generateRandomVector(dimension);
vectors.push({
id: vectorId,
dense_values: denseValues,
document_id: `doc_${Math.floor(i / 10)}` // Group vectors into documents
});
}
return vectors;
}
/**
* Perform test queries.
*/
async function performTestQueries(collection: Collection, numQueries: number, dimension: number): Promise<any[]> {
logger.info(`Performing ${numQueries} test queries`);
const results: any[] = [];
for (let i = 0; i < numQueries; i++) {
const queryVector = generateRandomVector(dimension);
const result = await collection.getSearch().dense({
query_vector: queryVector,
top_k: 5,
return_raw_text: true
});
results.push(result);
}
return results;
}
/**
* Main test function.
*/
async function main() {
logger.info("Starting test_sample_batch.ts...");
try {
// Initialize the client
logger.info("Initializing client...");
const client = new Client({
host: "http://127.0.0.1:8443",
username: "admin",
password: "test_key"
});
logger.info("Client initialized successfully");
// Configuration
const collectionName = "test_batch_collection";
const dimension = 768;
const numVectors = 10000;
const numQueries = 3;
// Create collection and index
const collection = await createTestCollection(client, collectionName, dimension);
const index = await createTestIndex(collection, "dense_index");
// Generate random vectors
const vectors: Vector[] = Array.from({ length: numVectors }, (_, i) => ({
id: `vec_${i}`,
dense_values: Array.from({ length: dimension }, () => Math.random() * 2 - 1),
document_id: `doc_${Math.floor(i/10)}` // Group vectors into documents
}));
// Test single vector upsert
logger.info("Testing single vector upsert...");
const txn1 = collection.transaction();
logger.info("Upserting single vector...");
await txn1.upsert_vector(vectors[0]);
await txn1.commit();
logger.info("Successfully upserted single vector");
// Test batch vector upsert
logger.info("Testing batch vector upsert...");
const txn2 = collection.transaction();
logger.info("Upserting remaining vectors...");
const startTime = Date.now();
await txn2.batch_upsert_vectors(vectors.slice(1));
const endTime = Date.now();
const elapsed = (endTime - startTime) / 1000;
logger.info(`batch_upsert_vectors took ${elapsed.toFixed(2)} seconds.`);
await txn2.commit();
logger.info("Successfully upserted remaining vectors");
// Perform test queries
const results = await performTestQueries(collection, numQueries, dimension);
for (let i = 0; i < results.length; i++) {
logger.info(`Query ${i + 1} results: ${JSON.stringify(results[i])}`);
}
// Cleanup
logger.info("Cleaning up...");
const denseIndex = await collection.getIndex("dense_index");
await denseIndex.delete();
await collection.delete();
logger.info("Cleanup completed successfully");
} catch (error) {
logger.error("An error occurred:", error);
throw error;
}
}
// Run the main function
main().catch(error => {
logger.error("Fatal error:", error);
process.exit(1);
});