From c469882a7df891eb9d8b6ff8fe662973f9b75f6f Mon Sep 17 00:00:00 2001 From: David Myriel Date: Mon, 9 Sep 2024 10:07:33 -0700 Subject: [PATCH] [docs] Named Vectors Examples (#1156) Co-authored-by: Anush --- .../content/documentation/concepts/vectors.md | 264 +++++++++++++++++- 1 file changed, 259 insertions(+), 5 deletions(-) diff --git a/qdrant-landing/content/documentation/concepts/vectors.md b/qdrant-landing/content/documentation/concepts/vectors.md index c081116e2..f08f45640 100644 --- a/qdrant-landing/content/documentation/concepts/vectors.md +++ b/qdrant-landing/content/documentation/concepts/vectors.md @@ -924,14 +924,16 @@ client.Query(context.Background(), &qdrant.QueryPoints{ ## Named Vectors -Aside from storing multiple vectors of the same shape in a single point, Qdrant supports storing multiple different vectors in a single point. +In Qdrant, you can store multiple vectors of different sizes in the same data [point](/documentation/concepts/points/). This is useful when you need to define your data with multiple embeddings to represent different features or modalities (e.g., image, text or video). -Each of these vectors should have a unique configuration and should be addressed by a unique name. -Also, each vector can be of a different type and be generated by a different embedding model. +To store different vectors for each point, you need to create separate named vector spaces in the [collection](/documentation/concepts/collections/). You can define these vector spaces during collection creation and manage them independently. + + To create a collection with named vectors, you need to specify a configuration for each vector: - ```http PUT /collections/{collection_name} { @@ -1082,8 +1084,260 @@ client.CreateCollection(context.Background(), &qdrant.CreateCollection{ }) ``` - +To insert a point with named vectors: +```http +PUT /collections/{collection_name}/points +{ + "points": [ + { + "id": 1, + "vector": { + "image": [0.9, 0.1, 0.1, 0.2], + "text": [0.4, 0.7, 0.1, 0.8, 0.1, 0.1, 0.9, 0.2] + } + } + ] +} +``` + +```python +client.upsert( + collection_name="{collection_name}", + points=[ + models.PointStruct( + id=1, + vector={ + "image": [0.9, 0.1, 0.1, 0.2], + "text": [0.4, 0.7, 0.1, 0.8, 0.1, 0.1, 0.9, 0.2], + }, + ), + ], +) +``` + +```typescript +client.upsert("{collection_name}", { + points: [ + { + id: 1, + vector: { + image: [0.9, 0.1, 0.1, 0.2], + text: [0.4, 0.7, 0.1, 0.8, 0.1, 0.1, 0.9, 0.2], + }, + }, + ], +}); +``` + +```rust +use std::collections::HashMap; + +use qdrant_client::qdrant::{PointStruct, UpsertPointsBuilder}; +use qdrant_client::Payload; + +client + .upsert_points( + UpsertPointsBuilder::new( + "{collection_name}", + vec![ + PointStruct::new( + 1, + HashMap::from([ + ("image".to_string(), vec![0.9, 0.1, 0.1, 0.2]), + ( + "text".to_string(), + vec![0.4, 0.7, 0.1, 0.8, 0.1, 0.1, 0.9, 0.2], + ), + ]), + Payload::default(), + ), + ], + ) + .wait(true), + ) + .await?; +``` + +```java +import java.util.List; +import java.util.Map; + +import static io.qdrant.client.PointIdFactory.id; +import static io.qdrant.client.VectorFactory.vector; +import static io.qdrant.client.VectorsFactory.namedVectors; + +import io.qdrant.client.grpc.Points.PointStruct; + +client + .upsertAsync( + "{collection_name}", + List.of( + PointStruct.newBuilder() + .setId(id(1)) + .setVectors( + namedVectors( + Map.of( + "image", + vector(List.of(0.9f, 0.1f, 0.1f, 0.2f)), + "text", + vector(List.of(0.4f, 0.7f, 0.1f, 0.8f, 0.1f, 0.1f, 0.9f, 0.2f))))) + .build())) + .get(); +``` + +```csharp +using Qdrant.Client; +using Qdrant.Client.Grpc; + +var client = new QdrantClient("localhost", 6334); + +await client.UpsertAsync( + collectionName: "{collection_name}", + points: new List + { + new() + { + Id = 1, + Vectors = new Dictionary + { + ["image"] = [0.9f, 0.1f, 0.1f, 0.2f], + ["text"] = [0.4f, 0.7f, 0.1f, 0.8f, 0.1f, 0.1f, 0.9f, 0.2f] + } + } + } +); +``` + +```go +import ( + "context" + + "github.com/qdrant/go-client/qdrant" +) + +client, err := qdrant.NewClient(&qdrant.Config{ + Host: "localhost", + Port: 6334, +}) + +client.Upsert(context.Background(), &qdrant.UpsertPoints{ + CollectionName: "{collection_name}", + Points: []*qdrant.PointStruct{ + { + Id: qdrant.NewIDNum(1), + Vectors: qdrant.NewVectorsMap(map[string]*qdrant.Vector{ + "image": qdrant.NewVector(0.9, 0.1, 0.1, 0.2), + "text": qdrant.NewVector(0.4, 0.7, 0.1, 0.8, 0.1, 0.1, 0.9, 0.2), + }), + }, + }, +}) +``` + +To search with named vectors (available in `query` API): + +```http +POST /collections/{collection_name}/points/query +{ + "query": [0.2, 0.1, 0.9, 0.7], + "using": "image", + "limit": 3 +} +``` + +```python +from qdrant_client import QdrantClient + +client = QdrantClient(url="http://localhost:6333") + +client.query_points( + collection_name="{collection_name}", + query=[0.2, 0.1, 0.9, 0.7], + using="image", + limit=3, +) +``` + +```typescript +import { QdrantClient } from "@qdrant/js-client-rest"; + +const client = new QdrantClient({ host: "localhost", port: 6333 }); + +client.query("{collection_name}", { + query: [0.2, 0.1, 0.9, 0.7], + using: "image", + limit: 3, +}); +``` + +```rust +use qdrant_client::qdrant::QueryPointsBuilder; +use qdrant_client::Qdrant; + +let client = Qdrant::from_url("http://localhost:6334").build()?; + +client + .query( + QueryPointsBuilder::new("{collection_name}") + .query(vec![0.2, 0.1, 0.9, 0.7]) + .limit(3) + .using("image"), + ) + .await?; +``` + +```java +import java.util.List; + +import io.qdrant.client.QdrantClient; +import io.qdrant.client.QdrantGrpcClient; +import io.qdrant.client.grpc.Points.QueryPoints; + +import static io.qdrant.client.QueryFactory.nearest; + +QdrantClient client = + new QdrantClient(QdrantGrpcClient.newBuilder("localhost", 6334, false).build()); + +client.queryAsync(QueryPoints.newBuilder() + .setCollectionName("{collection_name}") + .setQuery(nearest(0.2f, 0.1f, 0.9f, 0.7f)) + .setUsing("image") + .setLimit(3) + .build()).get(); +``` + +```csharp +using Qdrant.Client; + +var client = new QdrantClient("localhost", 6334); + +await client.QueryAsync( + collectionName: "{collection_name}", + query: new float[] { 0.2f, 0.1f, 0.9f, 0.7f }, + usingVector: "image", + limit: 3 +); +``` + +```go +import ( + "context" + + "github.com/qdrant/go-client/qdrant" +) + +client, err := qdrant.NewClient(&qdrant.Config{ + Host: "localhost", + Port: 6334, +}) + +client.Query(context.Background(), &qdrant.QueryPoints{ + CollectionName: "{collection_name}", + Query: qdrant.NewQuery(0.2, 0.1, 0.9, 0.7), + Using: qdrant.PtrOf("image"), +}) +``` ## Datatypes