This project contains a java client for the Qdrant vector database. The client supports HTTP and gRPC transport in either blocking or non-blocking fashion. For async operation a Future or RxJava3 based API can be used.
<dependency>
<groupId>io.metaloom.qdrant</groupId>
<artifactId>qdrant-java-grpc-client</artifactId>
<version>0.13.0</version>
</dependency>or for the HTTP client
<dependency>
<groupId>io.metaloom.qdrant</groupId>
<artifactId>qdrant-java-http-client</artifactId>
<version>0.13.0</version>
</dependency>NOTE: The http client currently (as of v1.2.0 of Qdrant) supports more methods compared to the gRPC client.
This client was build and tested for Qdrant server version v1.2.0. Minimum required JRE is current LTS version 17.
int port = qdrant.grpcPort(); // Default: 6334
String host = qdrant.getHost();
try (QDrantGRPCClient client = QDrantGRPCClient.builder()
.setHostname(host)
.setPort(port)
.build()) {
// Define the collection to store vectors
VectorParams params = VectorParams.newBuilder()
.setSize(4)
.setDistance(Distance.Euclid)
.build();
// Add the params to a map
VectorParamsMap paramsMap = VectorParamsMap.newBuilder()
.putMap("firstVector", params)
.putMap("secondVector", params)
.build();
// Create new collections - blocking
client.createCollection("test1", paramsMap).sync();
// .. or via Future API
client.createCollection("test2", params).async().get();
// .. or via RxJava API
client.createCollection("test3", params).rx().blockingGet();
// Insert a new vectors
for (int i = 0; i < 10; i++) {
// Vector of the point
float[] vector = new float[] { 0.43f + i, 0.1f, 0.61f, 1.45f - i };
// Payload of the point
Map<String, Value> payload = new HashMap<>();
payload.put("color", ModelHelper.value("blue"));
// Now construct the point
PointStruct point = ModelHelper.namedPoint(42L + i, "firstVector", vector, payload);
// .. and insert it
client.upsertPoint("test1", point, true).sync();
}
// Count points
long nPoints = client.countPoints("test1", null, true).sync().getResult().getCount();
// Now run KNN search
float[] searchVector = new float[] { 0.43f, 0.09f, 0.41f, 1.35f };
List<ScoredPoint> searchResults = client.searchPoints("test1", "firstVector", searchVector, 2, null).sync().getResultList();
for (ScoredPoint result : searchResults) {
System.out.println("Found: [" + result.getId().getNum() + "] " + result.getScore());
}
// Invoke backup via Snapshot API
client.createSnapshot("test1").sync();
}int port = qdrant.httpPort();
String host = qdrant.getHost();
try (QDrantHttpClient client = QDrantHttpClient.builder()
.setHostname(host)
.setPort(port)
.build()) {
// Create a collection
CollectionCreateRequest req = new CollectionCreateRequest();
req.setVectors("colors", 4, Distance.EUCLID);
client.createCollection("the-collection-name", req).sync();
// Now add some points
PointStruct p1 = PointStruct.of("colors", 0.42f, 0.33f, 42.15f, 68.72f)
.setPayload("{\"name\": \"first\"}")
.setId(1);
PointStruct p2 = PointStruct.of("colors", 0.76f, 0.43f, 63.45f, 22.10f)
.setPayload("{ \"color\": \"red\"}")
.setId(2);
PointStruct p3 = PointStruct.of("colors", 0.41f, 0.32f, 42.11f, 68.71f).setId(3);
PointStruct p4 = PointStruct.of("colors", 0.12f, 0.23f, 12.46f, 47.17f).setId(4);
PointsListUpsertRequest pointsRequest = new PointsListUpsertRequest();
pointsRequest.setPoints(p1, p2, p3, p4);
client.upsertPoints("the-collection-name", pointsRequest, false).async().blockingGet();
// List the collections
client.listCollections().async().blockingGet();
// Count the points in the collection
client.countPoints("the-collection-name", new PointCountRequest().setExact(true)).sync();
}# Bump qdrant.version in pom.xml and QDrantContainer#DEFAULT_VERSION
# Update maven version to next release
mvn versions:set -DgenerateBackupPoms=false
# Now run tests locally or via GitHub actions
mvn clean package
# Deploy to maven central and auto-close staging repo.
# Adding the property will trigger the profiles in the parent pom to include gpg,javadoc...
mvn clean deploy -Drelease