mirror of
https://github.com/qdrant/landing_page.git
synced 2026-10-06 11:28:31 +02:00
Generate multiple code snippets from a single source file (#2146)
* Support generating multiple snippets from one source file * Convert Python code snippets from one source file * Add code snippets for C#, Go, Java, Rust and TS * Make intro less Python-oriented * Add client installation instructions for all languages * Cleanup python code --------- Co-authored-by: xzfc <xzfcpw@gmail.com>
This commit is contained in:
+1
-1
@@ -13,7 +13,7 @@ points = []
|
||||
|
||||
for idx, item in enumerate(ds):
|
||||
passage = item["passage_text"]
|
||||
|
||||
|
||||
point = PointStruct(
|
||||
id=uuid.uuid4().hex, # use unique string ID
|
||||
payload=item,
|
||||
|
||||
+1
-1
@@ -16,7 +16,7 @@ points = []
|
||||
|
||||
for idx, item in enumerate(ds):
|
||||
passage = item["passage_text"]
|
||||
|
||||
|
||||
point = PointStruct(
|
||||
id=uuid.uuid4().hex, # use unique string ID
|
||||
payload=item,
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
```csharp
|
||||
Qdrant.Client
|
||||
```
|
||||
@@ -0,0 +1,3 @@
|
||||
```go
|
||||
github.com/qdrant/go-client
|
||||
```
|
||||
@@ -0,0 +1,3 @@
|
||||
```java
|
||||
io.qdrant:client
|
||||
```
|
||||
@@ -0,0 +1,3 @@
|
||||
```python
|
||||
qdrant-client
|
||||
```
|
||||
@@ -0,0 +1,3 @@
|
||||
```rust
|
||||
qdrant-client
|
||||
```
|
||||
@@ -0,0 +1,3 @@
|
||||
```typescript
|
||||
qdrant/js-client-rest
|
||||
```
|
||||
+1
@@ -0,0 +1 @@
|
||||
This code snippet shows how to create a semantic search engine with Qdrant. First, a client connection to Qdrant Cloud is established using the cluster URL and API key, and cloud inference is enabled for automatic embedding generation. Next, a collection named `my_books` is created with a vector size of 384 and cosine distance. A dataset of science fiction books is defined, and each book is stored as a point in the collection with a unique ID, a vector generated from the description, and a payload containing the book's metadata. Finally, a query is made to the search engine to find books related to an alien invasion, and the most relevant results are returned with their similarity scores. The code also demonstrates how to apply a filter to query in order to return only books published after the year 2000.
|
||||
-1
@@ -1 +0,0 @@
|
||||
This code snippet shows how to create a client connection to Qdrant Cloud, with the cluster URL and API key, and enables cloud inference for automatic embedding generation.
|
||||
-12
@@ -1,12 +0,0 @@
|
||||
# @hide-start
|
||||
QDRANT_URL=""
|
||||
QDRANT_API_KEY=""
|
||||
# @hide-end
|
||||
|
||||
from qdrant_client import QdrantClient, models
|
||||
|
||||
client = QdrantClient(
|
||||
url=QDRANT_URL,
|
||||
api_key=QDRANT_API_KEY,
|
||||
cloud_inference=True
|
||||
)
|
||||
-1
@@ -1 +0,0 @@
|
||||
This code snippet shows how to create a collection in Qdrant. The example creates a collection named `my_books` configured to store 384-dimensional vectors with cosine distance metric.
|
||||
-19
@@ -1,19 +0,0 @@
|
||||
# @hide-start
|
||||
from qdrant_client import QdrantClient, models
|
||||
|
||||
client = QdrantClient(
|
||||
url="",
|
||||
api_key="",
|
||||
cloud_inference=True
|
||||
)
|
||||
# @hide-end
|
||||
|
||||
COLLECTION_NAME="my_books"
|
||||
|
||||
client.create_collection(
|
||||
collection_name=COLLECTION_NAME,
|
||||
vectors_config=models.VectorParams(
|
||||
size=384, # Vector size is defined by the model
|
||||
distance=models.Distance.COSINE,
|
||||
),
|
||||
)
|
||||
-1
@@ -1 +0,0 @@
|
||||
This code snippet shows how to create a payload index on a specific field. The example creates an index on the `year` field of type integer, which enables efficient filtering on this field in subsequent queries.
|
||||
-17
@@ -1,17 +0,0 @@
|
||||
# @hide-start
|
||||
from qdrant_client import QdrantClient, models
|
||||
|
||||
client = QdrantClient(
|
||||
url="",
|
||||
api_key="",
|
||||
cloud_inference=True
|
||||
)
|
||||
|
||||
COLLECTION_NAME="my_books"
|
||||
# @hide-end
|
||||
|
||||
client.create_payload_index(
|
||||
collection_name=COLLECTION_NAME,
|
||||
field_name="year",
|
||||
field_schema=models.PayloadSchemaType.INTEGER,
|
||||
)
|
||||
+126
@@ -0,0 +1,126 @@
|
||||
using Qdrant.Client;
|
||||
using Qdrant.Client.Grpc;
|
||||
using static Qdrant.Client.Grpc.Conditions;
|
||||
|
||||
public class Snippet
|
||||
{
|
||||
public static async Task Run()
|
||||
{
|
||||
// @hide-start
|
||||
string QDRANT_URL = "";
|
||||
string QDRANT_API_KEY = "";
|
||||
// @hide-end
|
||||
// @block-start client-connection
|
||||
var client = new QdrantClient(
|
||||
host: QDRANT_URL,
|
||||
port: 6334,
|
||||
https: true,
|
||||
apiKey: QDRANT_API_KEY
|
||||
);
|
||||
// @block-end client-connection
|
||||
|
||||
// @block-start create-collection
|
||||
string COLLECTION_NAME = "my_books";
|
||||
|
||||
await client.CreateCollectionAsync(
|
||||
collectionName: COLLECTION_NAME,
|
||||
vectorsConfig: new VectorParams { Size = 384, Distance = Distance.Cosine }
|
||||
);
|
||||
// @block-end create-collection
|
||||
|
||||
// @block-start upload-data
|
||||
var payloads = new List<Dictionary<string, Value>>
|
||||
{
|
||||
new() { ["name"] = "The Time Machine", ["description"] = "A man travels through time and witnesses the evolution of humanity.", ["author"] = "H.G. Wells", ["year"] = 1895 },
|
||||
new() { ["name"] = "Ender's Game", ["description"] = "A young boy is trained to become a military leader in a war against an alien race.", ["author"] = "Orson Scott Card", ["year"] = 1985 },
|
||||
new() { ["name"] = "Brave New World", ["description"] = "A dystopian society where people are genetically engineered and conditioned to conform to a strict social hierarchy.", ["author"] = "Aldous Huxley", ["year"] = 1932 },
|
||||
new() { ["name"] = "The Hitchhiker's Guide to the Galaxy", ["description"] = "A comedic science fiction series following the misadventures of an unwitting human and his alien friend.", ["author"] = "Douglas Adams", ["year"] = 1979 },
|
||||
new() { ["name"] = "Dune", ["description"] = "A desert planet is the site of political intrigue and power struggles.", ["author"] = "Frank Herbert", ["year"] = 1965 },
|
||||
new() { ["name"] = "Foundation", ["description"] = "A mathematician develops a science to predict the future of humanity and works to save civilization from collapse.", ["author"] = "Isaac Asimov", ["year"] = 1951 },
|
||||
new() { ["name"] = "Snow Crash", ["description"] = "A futuristic world where the internet has evolved into a virtual reality metaverse.", ["author"] = "Neal Stephenson", ["year"] = 1992 },
|
||||
new() { ["name"] = "Neuromancer", ["description"] = "A hacker is hired to pull off a near-impossible hack and gets pulled into a web of intrigue.", ["author"] = "William Gibson", ["year"] = 1984 },
|
||||
new() { ["name"] = "The War of the Worlds", ["description"] = "A Martian invasion of Earth throws humanity into chaos.", ["author"] = "H.G. Wells", ["year"] = 1898 },
|
||||
new() { ["name"] = "The Hunger Games", ["description"] = "A dystopian society where teenagers are forced to fight to the death in a televised spectacle.", ["author"] = "Suzanne Collins", ["year"] = 2008 },
|
||||
new() { ["name"] = "The Andromeda Strain", ["description"] = "A deadly virus from outer space threatens to wipe out humanity.", ["author"] = "Michael Crichton", ["year"] = 1969 },
|
||||
new() { ["name"] = "The Left Hand of Darkness", ["description"] = "A human ambassador is sent to a planet where the inhabitants are genderless and can change gender at will.", ["author"] = "Ursula K. Le Guin", ["year"] = 1969 },
|
||||
new() { ["name"] = "The Three-Body Problem", ["description"] = "Humans encounter an alien civilization that lives in a dying system.", ["author"] = "Liu Cixin", ["year"] = 2008 }
|
||||
};
|
||||
// @block-end upload-data
|
||||
|
||||
// @block-start upload-points
|
||||
string EMBEDDING_MODEL = "sentence-transformers/all-minilm-l6-v2";
|
||||
|
||||
var points = new List<PointStruct>();
|
||||
|
||||
for (ulong idx = 0; idx < (ulong)payloads.Count; idx++)
|
||||
{
|
||||
var payload = payloads[(int)idx];
|
||||
string description = payload["description"].StringValue;
|
||||
|
||||
var point = new PointStruct
|
||||
{
|
||||
Id = idx,
|
||||
Vectors = new Document
|
||||
{
|
||||
Text = description,
|
||||
Model = EMBEDDING_MODEL
|
||||
},
|
||||
Payload = { payload }
|
||||
};
|
||||
|
||||
points.Add(point);
|
||||
}
|
||||
|
||||
await client.UpsertAsync(
|
||||
collectionName: COLLECTION_NAME,
|
||||
points: points
|
||||
);
|
||||
// @block-end upload-points
|
||||
|
||||
// @block-start query-engine
|
||||
var hits = await client.QueryAsync(
|
||||
collectionName: COLLECTION_NAME,
|
||||
query: new Document
|
||||
{
|
||||
Text = "alien invasion",
|
||||
Model = EMBEDDING_MODEL
|
||||
},
|
||||
limit: 3
|
||||
);
|
||||
|
||||
foreach (var hit in hits)
|
||||
{
|
||||
Console.WriteLine($"{hit.Payload} score: {hit.Score}");
|
||||
}
|
||||
// @block-end query-engine
|
||||
|
||||
// @block-start create-payload-index
|
||||
await client.CreatePayloadIndexAsync(
|
||||
collectionName: COLLECTION_NAME,
|
||||
fieldName: "year",
|
||||
schemaType: PayloadSchemaType.Integer
|
||||
);
|
||||
// @block-end create-payload-index
|
||||
|
||||
// @block-start query-with-filter
|
||||
var filteredHits = await client.QueryAsync(
|
||||
collectionName: COLLECTION_NAME,
|
||||
query: new Document
|
||||
{
|
||||
Text = "alien invasion",
|
||||
Model = EMBEDDING_MODEL
|
||||
},
|
||||
filter: new Filter
|
||||
{
|
||||
Must = { Range("year", new Qdrant.Client.Grpc.Range { Gte = 2000.0 }) }
|
||||
},
|
||||
limit: 1
|
||||
);
|
||||
|
||||
foreach (var hit in filteredHits)
|
||||
{
|
||||
Console.WriteLine($"{hit.Payload} score: {hit.Score}");
|
||||
}
|
||||
// @block-end query-with-filter
|
||||
}
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
```csharp
|
||||
var client = new QdrantClient(
|
||||
host: QDRANT_URL,
|
||||
port: 6334,
|
||||
https: true,
|
||||
apiKey: QDRANT_API_KEY
|
||||
);
|
||||
```
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
```go
|
||||
client, err := qdrant.NewClient(&qdrant.Config{
|
||||
Host: QDRANT_URL,
|
||||
APIKey: QDRANT_API_KEY,
|
||||
UseTLS: true,
|
||||
})
|
||||
```
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
```java
|
||||
QdrantClient client =
|
||||
new QdrantClient(
|
||||
QdrantGrpcClient.newBuilder(QDRANT_URL, 6334, true)
|
||||
.withApiKey(QDRANT_API_KEY)
|
||||
.build());
|
||||
```
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
```rust
|
||||
let client = Qdrant::from_url(QDRANT_URL)
|
||||
.api_key(QDRANT_API_KEY)
|
||||
.build()?;
|
||||
```
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
```typescript
|
||||
const client = new QdrantClient({
|
||||
url: QDRANT_URL,
|
||||
apiKey: QDRANT_API_KEY,
|
||||
});
|
||||
```
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
```csharp
|
||||
string COLLECTION_NAME = "my_books";
|
||||
|
||||
await client.CreateCollectionAsync(
|
||||
collectionName: COLLECTION_NAME,
|
||||
vectorsConfig: new VectorParams { Size = 384, Distance = Distance.Cosine }
|
||||
);
|
||||
```
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
```go
|
||||
collectionName := "my_books"
|
||||
|
||||
client.CreateCollection(context.Background(), &qdrant.CreateCollection{
|
||||
CollectionName: collectionName,
|
||||
VectorsConfig: qdrant.NewVectorsConfig(&qdrant.VectorParams{
|
||||
Size: 384, // Vector size is defined by used model
|
||||
Distance: qdrant.Distance_Cosine,
|
||||
}),
|
||||
})
|
||||
```
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
```java
|
||||
String COLLECTION_NAME = "my_books";
|
||||
|
||||
client.createCollectionAsync(COLLECTION_NAME,
|
||||
VectorParams.newBuilder().setDistance(Distance.Cosine).setSize(384).build()).get();
|
||||
```
|
||||
+1
-1
@@ -4,7 +4,7 @@ COLLECTION_NAME="my_books"
|
||||
client.create_collection(
|
||||
collection_name=COLLECTION_NAME,
|
||||
vectors_config=models.VectorParams(
|
||||
size=384, # Vector size is defined by the model
|
||||
size=384, # Vector size is defined by used model
|
||||
distance=models.Distance.COSINE,
|
||||
),
|
||||
)
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
```rust
|
||||
let collection_name = "my_books";
|
||||
|
||||
client
|
||||
.create_collection(
|
||||
CreateCollectionBuilder::new(collection_name)
|
||||
.vectors_config(VectorParamsBuilder::new(384, Distance::Cosine)), // Vector size is defined by used model
|
||||
)
|
||||
.await?;
|
||||
```
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
```typescript
|
||||
const collectionName = "my_books";
|
||||
|
||||
await client.createCollection(collectionName, {
|
||||
vectors: {
|
||||
size: 384, // Vector size is defined by used model
|
||||
distance: "Cosine",
|
||||
},
|
||||
});
|
||||
```
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
```csharp
|
||||
await client.CreatePayloadIndexAsync(
|
||||
collectionName: COLLECTION_NAME,
|
||||
fieldName: "year",
|
||||
schemaType: PayloadSchemaType.Integer
|
||||
);
|
||||
```
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
```go
|
||||
client.CreateFieldIndex(context.Background(), &qdrant.CreateFieldIndexCollection{
|
||||
CollectionName: collectionName,
|
||||
FieldName: "year",
|
||||
FieldType: qdrant.FieldType_FieldTypeInteger.Enum(),
|
||||
})
|
||||
```
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
```java
|
||||
client
|
||||
.createPayloadIndexAsync(
|
||||
COLLECTION_NAME,
|
||||
"year",
|
||||
PayloadSchemaType.Integer,
|
||||
null,
|
||||
true,
|
||||
null,
|
||||
null)
|
||||
.get();
|
||||
```
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
```rust
|
||||
client
|
||||
.create_field_index(
|
||||
CreateFieldIndexCollectionBuilder::new(collection_name, "year", FieldType::Integer)
|
||||
.wait(true),
|
||||
)
|
||||
.await?;
|
||||
```
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
```typescript
|
||||
await client.createPayloadIndex(collectionName, {
|
||||
field_name: "year",
|
||||
field_schema: "integer",
|
||||
});
|
||||
```
|
||||
+104
@@ -0,0 +1,104 @@
|
||||
```csharp
|
||||
using Qdrant.Client;
|
||||
using Qdrant.Client.Grpc;
|
||||
using static Qdrant.Client.Grpc.Conditions;
|
||||
|
||||
var client = new QdrantClient(
|
||||
host: QDRANT_URL,
|
||||
port: 6334,
|
||||
https: true,
|
||||
apiKey: QDRANT_API_KEY
|
||||
);
|
||||
|
||||
string COLLECTION_NAME = "my_books";
|
||||
|
||||
await client.CreateCollectionAsync(
|
||||
collectionName: COLLECTION_NAME,
|
||||
vectorsConfig: new VectorParams { Size = 384, Distance = Distance.Cosine }
|
||||
);
|
||||
|
||||
var payloads = new List<Dictionary<string, Value>>
|
||||
{
|
||||
new() { ["name"] = "The Time Machine", ["description"] = "A man travels through time and witnesses the evolution of humanity.", ["author"] = "H.G. Wells", ["year"] = 1895 },
|
||||
new() { ["name"] = "Ender's Game", ["description"] = "A young boy is trained to become a military leader in a war against an alien race.", ["author"] = "Orson Scott Card", ["year"] = 1985 },
|
||||
new() { ["name"] = "Brave New World", ["description"] = "A dystopian society where people are genetically engineered and conditioned to conform to a strict social hierarchy.", ["author"] = "Aldous Huxley", ["year"] = 1932 },
|
||||
new() { ["name"] = "The Hitchhiker's Guide to the Galaxy", ["description"] = "A comedic science fiction series following the misadventures of an unwitting human and his alien friend.", ["author"] = "Douglas Adams", ["year"] = 1979 },
|
||||
new() { ["name"] = "Dune", ["description"] = "A desert planet is the site of political intrigue and power struggles.", ["author"] = "Frank Herbert", ["year"] = 1965 },
|
||||
new() { ["name"] = "Foundation", ["description"] = "A mathematician develops a science to predict the future of humanity and works to save civilization from collapse.", ["author"] = "Isaac Asimov", ["year"] = 1951 },
|
||||
new() { ["name"] = "Snow Crash", ["description"] = "A futuristic world where the internet has evolved into a virtual reality metaverse.", ["author"] = "Neal Stephenson", ["year"] = 1992 },
|
||||
new() { ["name"] = "Neuromancer", ["description"] = "A hacker is hired to pull off a near-impossible hack and gets pulled into a web of intrigue.", ["author"] = "William Gibson", ["year"] = 1984 },
|
||||
new() { ["name"] = "The War of the Worlds", ["description"] = "A Martian invasion of Earth throws humanity into chaos.", ["author"] = "H.G. Wells", ["year"] = 1898 },
|
||||
new() { ["name"] = "The Hunger Games", ["description"] = "A dystopian society where teenagers are forced to fight to the death in a televised spectacle.", ["author"] = "Suzanne Collins", ["year"] = 2008 },
|
||||
new() { ["name"] = "The Andromeda Strain", ["description"] = "A deadly virus from outer space threatens to wipe out humanity.", ["author"] = "Michael Crichton", ["year"] = 1969 },
|
||||
new() { ["name"] = "The Left Hand of Darkness", ["description"] = "A human ambassador is sent to a planet where the inhabitants are genderless and can change gender at will.", ["author"] = "Ursula K. Le Guin", ["year"] = 1969 },
|
||||
new() { ["name"] = "The Three-Body Problem", ["description"] = "Humans encounter an alien civilization that lives in a dying system.", ["author"] = "Liu Cixin", ["year"] = 2008 }
|
||||
};
|
||||
|
||||
string EMBEDDING_MODEL = "sentence-transformers/all-minilm-l6-v2";
|
||||
|
||||
var points = new List<PointStruct>();
|
||||
|
||||
for (ulong idx = 0; idx < (ulong)payloads.Count; idx++)
|
||||
{
|
||||
var payload = payloads[(int)idx];
|
||||
string description = payload["description"].StringValue;
|
||||
|
||||
var point = new PointStruct
|
||||
{
|
||||
Id = idx,
|
||||
Vectors = new Document
|
||||
{
|
||||
Text = description,
|
||||
Model = EMBEDDING_MODEL
|
||||
},
|
||||
Payload = { payload }
|
||||
};
|
||||
|
||||
points.Add(point);
|
||||
}
|
||||
|
||||
await client.UpsertAsync(
|
||||
collectionName: COLLECTION_NAME,
|
||||
points: points
|
||||
);
|
||||
|
||||
var hits = await client.QueryAsync(
|
||||
collectionName: COLLECTION_NAME,
|
||||
query: new Document
|
||||
{
|
||||
Text = "alien invasion",
|
||||
Model = EMBEDDING_MODEL
|
||||
},
|
||||
limit: 3
|
||||
);
|
||||
|
||||
foreach (var hit in hits)
|
||||
{
|
||||
Console.WriteLine($"{hit.Payload} score: {hit.Score}");
|
||||
}
|
||||
|
||||
await client.CreatePayloadIndexAsync(
|
||||
collectionName: COLLECTION_NAME,
|
||||
fieldName: "year",
|
||||
schemaType: PayloadSchemaType.Integer
|
||||
);
|
||||
|
||||
var filteredHits = await client.QueryAsync(
|
||||
collectionName: COLLECTION_NAME,
|
||||
query: new Document
|
||||
{
|
||||
Text = "alien invasion",
|
||||
Model = EMBEDDING_MODEL
|
||||
},
|
||||
filter: new Filter
|
||||
{
|
||||
Must = { Range("year", new Qdrant.Client.Grpc.Range { Gte = 2000.0 }) }
|
||||
},
|
||||
limit: 1
|
||||
);
|
||||
|
||||
foreach (var hit in filteredHits)
|
||||
{
|
||||
Console.WriteLine($"{hit.Payload} score: {hit.Score}");
|
||||
}
|
||||
```
|
||||
+163
@@ -0,0 +1,163 @@
|
||||
```go
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/qdrant/go-client/qdrant"
|
||||
)
|
||||
|
||||
client, err := qdrant.NewClient(&qdrant.Config{
|
||||
Host: QDRANT_URL,
|
||||
APIKey: QDRANT_API_KEY,
|
||||
UseTLS: true,
|
||||
})
|
||||
|
||||
collectionName := "my_books"
|
||||
|
||||
client.CreateCollection(context.Background(), &qdrant.CreateCollection{
|
||||
CollectionName: collectionName,
|
||||
VectorsConfig: qdrant.NewVectorsConfig(&qdrant.VectorParams{
|
||||
Size: 384, // Vector size is defined by used model
|
||||
Distance: qdrant.Distance_Cosine,
|
||||
}),
|
||||
})
|
||||
|
||||
documents := []map[string]any{
|
||||
{
|
||||
"name": "The Time Machine",
|
||||
"description": "A man travels through time and witnesses the evolution of humanity.",
|
||||
"author": "H.G. Wells",
|
||||
"year": 1895,
|
||||
},
|
||||
{
|
||||
"name": "Ender's Game",
|
||||
"description": "A young boy is trained to become a military leader in a war against an alien race.",
|
||||
"author": "Orson Scott Card",
|
||||
"year": 1985,
|
||||
},
|
||||
{
|
||||
"name": "Brave New World",
|
||||
"description": "A dystopian society where people are genetically engineered and conditioned to conform to a strict social hierarchy.",
|
||||
"author": "Aldous Huxley",
|
||||
"year": 1932,
|
||||
},
|
||||
{
|
||||
"name": "The Hitchhiker's Guide to the Galaxy",
|
||||
"description": "A comedic science fiction series following the misadventures of an unwitting human and his alien friend.",
|
||||
"author": "Douglas Adams",
|
||||
"year": 1979,
|
||||
},
|
||||
{
|
||||
"name": "Dune",
|
||||
"description": "A desert planet is the site of political intrigue and power struggles.",
|
||||
"author": "Frank Herbert",
|
||||
"year": 1965,
|
||||
},
|
||||
{
|
||||
"name": "Foundation",
|
||||
"description": "A mathematician develops a science to predict the future of humanity and works to save civilization from collapse.",
|
||||
"author": "Isaac Asimov",
|
||||
"year": 1951,
|
||||
},
|
||||
{
|
||||
"name": "Snow Crash",
|
||||
"description": "A futuristic world where the internet has evolved into a virtual reality metaverse.",
|
||||
"author": "Neal Stephenson",
|
||||
"year": 1992,
|
||||
},
|
||||
{
|
||||
"name": "Neuromancer",
|
||||
"description": "A hacker is hired to pull off a near-impossible hack and gets pulled into a web of intrigue.",
|
||||
"author": "William Gibson",
|
||||
"year": 1984,
|
||||
},
|
||||
{
|
||||
"name": "The War of the Worlds",
|
||||
"description": "A Martian invasion of Earth throws humanity into chaos.",
|
||||
"author": "H.G. Wells",
|
||||
"year": 1898,
|
||||
},
|
||||
{
|
||||
"name": "The Hunger Games",
|
||||
"description": "A dystopian society where teenagers are forced to fight to the death in a televised spectacle.",
|
||||
"author": "Suzanne Collins",
|
||||
"year": 2008,
|
||||
},
|
||||
{
|
||||
"name": "The Andromeda Strain",
|
||||
"description": "A deadly virus from outer space threatens to wipe out humanity.",
|
||||
"author": "Michael Crichton",
|
||||
"year": 1969,
|
||||
},
|
||||
{
|
||||
"name": "The Left Hand of Darkness",
|
||||
"description": "A human ambassador is sent to a planet where the inhabitants are genderless and can change gender at will.",
|
||||
"author": "Ursula K. Le Guin",
|
||||
"year": 1969,
|
||||
},
|
||||
{
|
||||
"name": "The Three-Body Problem",
|
||||
"description": "Humans encounter an alien civilization that lives in a dying system.",
|
||||
"author": "Liu Cixin",
|
||||
"year": 2008,
|
||||
},
|
||||
}
|
||||
|
||||
embeddingModel := "sentence-transformers/all-minilm-l6-v2"
|
||||
|
||||
points := make([]*qdrant.PointStruct, len(documents))
|
||||
for idx, doc := range documents {
|
||||
points[idx] = &qdrant.PointStruct{
|
||||
Id: qdrant.NewIDNum(uint64(idx)),
|
||||
Vectors: qdrant.NewVectorsDocument(&qdrant.Document{
|
||||
Text: doc["description"].(string),
|
||||
Model: embeddingModel,
|
||||
}),
|
||||
Payload: qdrant.NewValueMap(doc),
|
||||
}
|
||||
}
|
||||
|
||||
client.Upsert(context.Background(), &qdrant.UpsertPoints{
|
||||
CollectionName: collectionName,
|
||||
Points: points,
|
||||
})
|
||||
|
||||
queryResult, err := client.Query(context.Background(), &qdrant.QueryPoints{
|
||||
CollectionName: collectionName,
|
||||
Query: qdrant.NewQueryDocument(&qdrant.Document{
|
||||
Text: "alien invasion",
|
||||
Model: embeddingModel,
|
||||
}),
|
||||
Limit: qdrant.PtrOf(uint64(3)),
|
||||
})
|
||||
|
||||
for _, hit := range queryResult {
|
||||
fmt.Println(hit.Payload, "score:", hit.Score)
|
||||
}
|
||||
|
||||
client.CreateFieldIndex(context.Background(), &qdrant.CreateFieldIndexCollection{
|
||||
CollectionName: collectionName,
|
||||
FieldName: "year",
|
||||
FieldType: qdrant.FieldType_FieldTypeInteger.Enum(),
|
||||
})
|
||||
|
||||
queryResultFiltered, err := client.Query(context.Background(), &qdrant.QueryPoints{
|
||||
CollectionName: collectionName,
|
||||
Query: qdrant.NewQueryDocument(&qdrant.Document{
|
||||
Text: "alien invasion",
|
||||
Model: embeddingModel,
|
||||
}),
|
||||
Filter: &qdrant.Filter{
|
||||
Must: []*qdrant.Condition{
|
||||
qdrant.NewRange("year", &qdrant.Range{
|
||||
Gte: qdrant.PtrOf(2000.0),
|
||||
}),
|
||||
},
|
||||
},
|
||||
Limit: qdrant.PtrOf(uint64(1)),
|
||||
})
|
||||
|
||||
for _, hit := range queryResultFiltered {
|
||||
fmt.Println(hit.Payload, "score:", hit.Score)
|
||||
}
|
||||
```
|
||||
+191
@@ -0,0 +1,191 @@
|
||||
```java
|
||||
import static io.qdrant.client.ConditionFactory.range;
|
||||
import static io.qdrant.client.PointIdFactory.id;
|
||||
import static io.qdrant.client.QueryFactory.nearest;
|
||||
import static io.qdrant.client.ValueFactory.value;
|
||||
import static io.qdrant.client.VectorFactory.vector;
|
||||
import static io.qdrant.client.VectorsFactory.vectors;
|
||||
|
||||
import io.qdrant.client.QdrantClient;
|
||||
import io.qdrant.client.QdrantGrpcClient;
|
||||
import io.qdrant.client.grpc.Collections.Distance;
|
||||
import io.qdrant.client.grpc.Collections.PayloadSchemaType;
|
||||
import io.qdrant.client.grpc.Collections.VectorParams;
|
||||
import io.qdrant.client.grpc.Common.Filter;
|
||||
import io.qdrant.client.grpc.Common.Range;
|
||||
import io.qdrant.client.grpc.JsonWithInt.Value;
|
||||
import io.qdrant.client.grpc.Points.Document;
|
||||
import io.qdrant.client.grpc.Points.PointStruct;
|
||||
import io.qdrant.client.grpc.Points.QueryPoints;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
QdrantClient client =
|
||||
new QdrantClient(
|
||||
QdrantGrpcClient.newBuilder(QDRANT_URL, 6334, true)
|
||||
.withApiKey(QDRANT_API_KEY)
|
||||
.build());
|
||||
|
||||
String COLLECTION_NAME = "my_books";
|
||||
|
||||
client.createCollectionAsync(COLLECTION_NAME,
|
||||
VectorParams.newBuilder().setDistance(Distance.Cosine).setSize(384).build()).get();
|
||||
|
||||
List<Map<String, Value>> payloads = List.of(
|
||||
Map.of(
|
||||
"name", value("The Time Machine"),
|
||||
"description", value("A man travels through time and witnesses the evolution of humanity."),
|
||||
"author", value("H.G. Wells"),
|
||||
"year", value(1895)),
|
||||
Map.of(
|
||||
"name", value("Ender's Game"),
|
||||
"description",
|
||||
value("A young boy is trained to become a military leader in a war against an alien race."),
|
||||
"author", value("Orson Scott Card"),
|
||||
"year", value(1985)),
|
||||
Map.of(
|
||||
"name", value("Brave New World"),
|
||||
"description",
|
||||
value(
|
||||
"A dystopian society where people are genetically engineered and conditioned to conform to a strict social hierarchy."),
|
||||
"author", value("Aldous Huxley"),
|
||||
"year", value(1932)),
|
||||
Map.of(
|
||||
"name", value("The Hitchhiker's Guide to the Galaxy"),
|
||||
"description",
|
||||
value(
|
||||
"A comedic science fiction series following the misadventures of an unwitting human and his alien friend."),
|
||||
"author", value("Douglas Adams"),
|
||||
"year", value(1979)),
|
||||
Map.of(
|
||||
"name", value("Dune"),
|
||||
"description", value("A desert planet is the site of political intrigue and power struggles."),
|
||||
"author", value("Frank Herbert"),
|
||||
"year", value(1965)),
|
||||
Map.of(
|
||||
"name", value("Foundation"),
|
||||
"description",
|
||||
value(
|
||||
"A mathematician develops a science to predict the future of humanity and works to save civilization from collapse."),
|
||||
"author", value("Isaac Asimov"),
|
||||
"year", value(1951)),
|
||||
Map.of(
|
||||
"name", value("Snow Crash"),
|
||||
"description",
|
||||
value("A futuristic world where the internet has evolved into a virtual reality metaverse."),
|
||||
"author", value("Neal Stephenson"),
|
||||
"year", value(1992)),
|
||||
Map.of(
|
||||
"name", value("Neuromancer"),
|
||||
"description",
|
||||
value(
|
||||
"A hacker is hired to pull off a near-impossible hack and gets pulled into a web of intrigue."),
|
||||
"author", value("William Gibson"),
|
||||
"year", value(1984)),
|
||||
Map.of(
|
||||
"name", value("The War of the Worlds"),
|
||||
"description", value("A Martian invasion of Earth throws humanity into chaos."),
|
||||
"author", value("H.G. Wells"),
|
||||
"year", value(1898)),
|
||||
Map.of(
|
||||
"name", value("The Hunger Games"),
|
||||
"description",
|
||||
value("A dystopian society where teenagers are forced to fight to the death in a televised spectacle."),
|
||||
"author", value("Suzanne Collins"),
|
||||
"year", value(2008)),
|
||||
Map.of(
|
||||
"name", value("The Andromeda Strain"),
|
||||
"description", value("A deadly virus from outer space threatens to wipe out humanity."),
|
||||
"author", value("Michael Crichton"),
|
||||
"year", value(1969)),
|
||||
Map.of(
|
||||
"name", value("The Left Hand of Darkness"),
|
||||
"description",
|
||||
value(
|
||||
"A human ambassador is sent to a planet where the inhabitants are genderless and can change gender at will."),
|
||||
"author", value("Ursula K. Le Guin"),
|
||||
"year", value(1969)),
|
||||
Map.of(
|
||||
"name", value("The Three-Body Problem"),
|
||||
"description", value("Humans encounter an alien civilization that lives in a dying system."),
|
||||
"author", value("Liu Cixin"),
|
||||
"year", value(2008)));
|
||||
|
||||
String EMBEDDING_MODEL = "sentence-transformers/all-minilm-l6-v2";
|
||||
|
||||
List<PointStruct> points = new ArrayList<>();
|
||||
|
||||
for (int idx = 0; idx < payloads.size(); idx++) {
|
||||
Map<String, Value> payload = payloads.get(idx);
|
||||
String description = payload.get("description").getStringValue();
|
||||
|
||||
PointStruct point =
|
||||
PointStruct.newBuilder()
|
||||
.setId(id((long) idx))
|
||||
.setVectors(
|
||||
vectors(
|
||||
vector(
|
||||
Document.newBuilder()
|
||||
.setText(description)
|
||||
.setModel(EMBEDDING_MODEL)
|
||||
.build())))
|
||||
.putAllPayload(payload)
|
||||
.build();
|
||||
|
||||
points.add(point);
|
||||
}
|
||||
|
||||
client.upsertAsync(COLLECTION_NAME, points).get();
|
||||
|
||||
QueryPoints request =
|
||||
QueryPoints.newBuilder()
|
||||
.setCollectionName(COLLECTION_NAME)
|
||||
.setQuery(
|
||||
nearest(
|
||||
Document.newBuilder()
|
||||
.setText("alien invasion")
|
||||
.setModel(EMBEDDING_MODEL)
|
||||
.build()))
|
||||
.setLimit(3)
|
||||
.build();
|
||||
|
||||
var hits = client.queryAsync(request).get();
|
||||
|
||||
for (var hit : hits) {
|
||||
System.out.println(hit.getPayloadMap() + " score: " + hit.getScore());
|
||||
}
|
||||
|
||||
client
|
||||
.createPayloadIndexAsync(
|
||||
COLLECTION_NAME,
|
||||
"year",
|
||||
PayloadSchemaType.Integer,
|
||||
null,
|
||||
true,
|
||||
null,
|
||||
null)
|
||||
.get();
|
||||
|
||||
QueryPoints filteredRequest =
|
||||
QueryPoints.newBuilder()
|
||||
.setCollectionName(COLLECTION_NAME)
|
||||
.setQuery(
|
||||
nearest(
|
||||
Document.newBuilder()
|
||||
.setText("alien invasion")
|
||||
.setModel(EMBEDDING_MODEL)
|
||||
.build()))
|
||||
.setFilter(
|
||||
Filter.newBuilder()
|
||||
.addMust(range("year", Range.newBuilder().setGte(2000.0).build()))
|
||||
.build())
|
||||
.setLimit(1)
|
||||
.build();
|
||||
|
||||
var filteredHits = client.queryAsync(filteredRequest).get();
|
||||
|
||||
for (var hit : filteredHits) {
|
||||
System.out.println(hit.getPayloadMap() + " score: " + hit.getScore());
|
||||
}
|
||||
```
|
||||
+71
-1
@@ -1,3 +1,22 @@
|
||||
```python
|
||||
from qdrant_client import QdrantClient, models
|
||||
|
||||
client = QdrantClient(
|
||||
url=QDRANT_URL,
|
||||
api_key=QDRANT_API_KEY,
|
||||
cloud_inference=True
|
||||
)
|
||||
|
||||
COLLECTION_NAME="my_books"
|
||||
|
||||
client.create_collection(
|
||||
collection_name=COLLECTION_NAME,
|
||||
vectors_config=models.VectorParams(
|
||||
size=384, # Vector size is defined by used model
|
||||
distance=models.Distance.COSINE,
|
||||
),
|
||||
)
|
||||
|
||||
documents = [
|
||||
{
|
||||
"name": "The Time Machine",
|
||||
@@ -77,4 +96,55 @@ documents = [
|
||||
"author": "Liu Cixin",
|
||||
"year": 2008,
|
||||
},
|
||||
]
|
||||
]
|
||||
|
||||
EMBEDDING_MODEL="sentence-transformers/all-minilm-l6-v2"
|
||||
|
||||
client.upload_points(
|
||||
collection_name=COLLECTION_NAME,
|
||||
points=[
|
||||
models.PointStruct(
|
||||
id=idx,
|
||||
vector=models.Document(
|
||||
text=doc["description"],
|
||||
model=EMBEDDING_MODEL
|
||||
),
|
||||
payload=doc
|
||||
)
|
||||
for idx, doc in enumerate(documents)
|
||||
],
|
||||
)
|
||||
|
||||
hits = client.query_points(
|
||||
collection_name=COLLECTION_NAME,
|
||||
query=models.Document(
|
||||
text="alien invasion",
|
||||
model=EMBEDDING_MODEL
|
||||
),
|
||||
limit=3,
|
||||
).points
|
||||
|
||||
for hit in hits:
|
||||
print(hit.payload, "score:", hit.score)
|
||||
|
||||
client.create_payload_index(
|
||||
collection_name=COLLECTION_NAME,
|
||||
field_name="year",
|
||||
field_schema=models.PayloadSchemaType.INTEGER,
|
||||
)
|
||||
|
||||
hits = client.query_points(
|
||||
collection_name=COLLECTION_NAME,
|
||||
query=models.Document(
|
||||
text="alien invasion",
|
||||
model=EMBEDDING_MODEL
|
||||
),
|
||||
query_filter=models.Filter(
|
||||
must=[models.FieldCondition(key="year", range=models.Range(gte=2000))]
|
||||
),
|
||||
limit=1,
|
||||
).points
|
||||
|
||||
for hit in hits:
|
||||
print(hit.payload, "score:", hit.score)
|
||||
```
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
```csharp
|
||||
var hits = await client.QueryAsync(
|
||||
collectionName: COLLECTION_NAME,
|
||||
query: new Document
|
||||
{
|
||||
Text = "alien invasion",
|
||||
Model = EMBEDDING_MODEL
|
||||
},
|
||||
limit: 3
|
||||
);
|
||||
|
||||
foreach (var hit in hits)
|
||||
{
|
||||
Console.WriteLine($"{hit.Payload} score: {hit.Score}");
|
||||
}
|
||||
```
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
```go
|
||||
queryResult, err := client.Query(context.Background(), &qdrant.QueryPoints{
|
||||
CollectionName: collectionName,
|
||||
Query: qdrant.NewQueryDocument(&qdrant.Document{
|
||||
Text: "alien invasion",
|
||||
Model: embeddingModel,
|
||||
}),
|
||||
Limit: qdrant.PtrOf(uint64(3)),
|
||||
})
|
||||
|
||||
for _, hit := range queryResult {
|
||||
fmt.Println(hit.Payload, "score:", hit.Score)
|
||||
}
|
||||
```
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
```java
|
||||
QueryPoints request =
|
||||
QueryPoints.newBuilder()
|
||||
.setCollectionName(COLLECTION_NAME)
|
||||
.setQuery(
|
||||
nearest(
|
||||
Document.newBuilder()
|
||||
.setText("alien invasion")
|
||||
.setModel(EMBEDDING_MODEL)
|
||||
.build()))
|
||||
.setLimit(3)
|
||||
.build();
|
||||
|
||||
var hits = client.queryAsync(request).get();
|
||||
|
||||
for (var hit : hits) {
|
||||
System.out.println(hit.getPayloadMap() + " score: " + hit.getScore());
|
||||
}
|
||||
```
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
```rust
|
||||
let query_result = client
|
||||
.query(
|
||||
QueryPointsBuilder::new(collection_name)
|
||||
.query(Query::new_nearest(Document::new(
|
||||
"alien invasion",
|
||||
embedding_model,
|
||||
)))
|
||||
.limit(3)
|
||||
.with_payload(true),
|
||||
)
|
||||
.await?;
|
||||
|
||||
for hit in query_result.result {
|
||||
println!("{:?} score: {}", hit.payload, hit.score);
|
||||
}
|
||||
```
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
```typescript
|
||||
const queryResult = await client.query(collectionName, {
|
||||
query: {
|
||||
text: "alien invasion",
|
||||
model: embeddingModel,
|
||||
},
|
||||
limit: 3,
|
||||
});
|
||||
|
||||
for (const hit of queryResult.points) {
|
||||
console.log(hit.payload, "score:", hit.score);
|
||||
}
|
||||
```
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
```csharp
|
||||
var filteredHits = await client.QueryAsync(
|
||||
collectionName: COLLECTION_NAME,
|
||||
query: new Document
|
||||
{
|
||||
Text = "alien invasion",
|
||||
Model = EMBEDDING_MODEL
|
||||
},
|
||||
filter: new Filter
|
||||
{
|
||||
Must = { Range("year", new Qdrant.Client.Grpc.Range { Gte = 2000.0 }) }
|
||||
},
|
||||
limit: 1
|
||||
);
|
||||
|
||||
foreach (var hit in filteredHits)
|
||||
{
|
||||
Console.WriteLine($"{hit.Payload} score: {hit.Score}");
|
||||
}
|
||||
```
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
```go
|
||||
queryResultFiltered, err := client.Query(context.Background(), &qdrant.QueryPoints{
|
||||
CollectionName: collectionName,
|
||||
Query: qdrant.NewQueryDocument(&qdrant.Document{
|
||||
Text: "alien invasion",
|
||||
Model: embeddingModel,
|
||||
}),
|
||||
Filter: &qdrant.Filter{
|
||||
Must: []*qdrant.Condition{
|
||||
qdrant.NewRange("year", &qdrant.Range{
|
||||
Gte: qdrant.PtrOf(2000.0),
|
||||
}),
|
||||
},
|
||||
},
|
||||
Limit: qdrant.PtrOf(uint64(1)),
|
||||
})
|
||||
|
||||
for _, hit := range queryResultFiltered {
|
||||
fmt.Println(hit.Payload, "score:", hit.Score)
|
||||
}
|
||||
```
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
```java
|
||||
QueryPoints filteredRequest =
|
||||
QueryPoints.newBuilder()
|
||||
.setCollectionName(COLLECTION_NAME)
|
||||
.setQuery(
|
||||
nearest(
|
||||
Document.newBuilder()
|
||||
.setText("alien invasion")
|
||||
.setModel(EMBEDDING_MODEL)
|
||||
.build()))
|
||||
.setFilter(
|
||||
Filter.newBuilder()
|
||||
.addMust(range("year", Range.newBuilder().setGte(2000.0).build()))
|
||||
.build())
|
||||
.setLimit(1)
|
||||
.build();
|
||||
|
||||
var filteredHits = client.queryAsync(filteredRequest).get();
|
||||
|
||||
for (var hit : filteredHits) {
|
||||
System.out.println(hit.getPayloadMap() + " score: " + hit.getScore());
|
||||
}
|
||||
```
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
```rust
|
||||
let query_result_filtered = client
|
||||
.query(
|
||||
QueryPointsBuilder::new(collection_name)
|
||||
.query(Query::new_nearest(Document::new(
|
||||
"alien invasion",
|
||||
embedding_model,
|
||||
)))
|
||||
.filter(Filter::must([Condition::range(
|
||||
"year",
|
||||
Range {
|
||||
gte: Some(2000.0),
|
||||
..Default::default()
|
||||
},
|
||||
)]))
|
||||
.limit(1)
|
||||
.with_payload(true),
|
||||
)
|
||||
.await?;
|
||||
|
||||
for hit in query_result_filtered.result {
|
||||
println!("{:?} score: {}", hit.payload, hit.score);
|
||||
}
|
||||
```
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
```typescript
|
||||
const queryResultFiltered = await client.query(collectionName, {
|
||||
query: {
|
||||
text: "alien invasion",
|
||||
model: embeddingModel,
|
||||
},
|
||||
filter: {
|
||||
must: [
|
||||
{
|
||||
key: "year",
|
||||
range: {
|
||||
gte: 2000,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
limit: 1,
|
||||
});
|
||||
|
||||
for (const hit of queryResultFiltered.points) {
|
||||
console.log(hit.payload, "score:", hit.score);
|
||||
}
|
||||
```
|
||||
+105
@@ -0,0 +1,105 @@
|
||||
```rust
|
||||
use qdrant_client::qdrant::{
|
||||
Condition, CreateCollectionBuilder, CreateFieldIndexCollectionBuilder, Distance, Document,
|
||||
FieldType, Filter, PointStruct, Query, QueryPointsBuilder, Range, UpsertPointsBuilder, VectorParamsBuilder,
|
||||
};
|
||||
use qdrant_client::Qdrant;
|
||||
|
||||
let client = Qdrant::from_url(QDRANT_URL)
|
||||
.api_key(QDRANT_API_KEY)
|
||||
.build()?;
|
||||
|
||||
let collection_name = "my_books";
|
||||
|
||||
client
|
||||
.create_collection(
|
||||
CreateCollectionBuilder::new(collection_name)
|
||||
.vectors_config(VectorParamsBuilder::new(384, Distance::Cosine)), // Vector size is defined by used model
|
||||
)
|
||||
.await?;
|
||||
|
||||
let documents = [
|
||||
("The Time Machine", "A man travels through time and witnesses the evolution of humanity.", "H.G. Wells", 1895),
|
||||
("Ender's Game", "A young boy is trained to become a military leader in a war against an alien race.", "Orson Scott Card", 1985),
|
||||
("Brave New World", "A dystopian society where people are genetically engineered and conditioned to conform to a strict social hierarchy.", "Aldous Huxley", 1932),
|
||||
("The Hitchhiker's Guide to the Galaxy", "A comedic science fiction series following the misadventures of an unwitting human and his alien friend.", "Douglas Adams", 1979),
|
||||
("Dune", "A desert planet is the site of political intrigue and power struggles.", "Frank Herbert", 1965),
|
||||
("Foundation", "A mathematician develops a science to predict the future of humanity and works to save civilization from collapse.", "Isaac Asimov", 1951),
|
||||
("Snow Crash", "A futuristic world where the internet has evolved into a virtual reality metaverse.", "Neal Stephenson", 1992),
|
||||
("Neuromancer", "A hacker is hired to pull off a near-impossible hack and gets pulled into a web of intrigue.", "William Gibson", 1984),
|
||||
("The War of the Worlds", "A Martian invasion of Earth throws humanity into chaos.", "H.G. Wells", 1898),
|
||||
("The Hunger Games", "A dystopian society where teenagers are forced to fight to the death in a televised spectacle.", "Suzanne Collins", 2008),
|
||||
("The Andromeda Strain", "A deadly virus from outer space threatens to wipe out humanity.", "Michael Crichton", 1969),
|
||||
("The Left Hand of Darkness", "A human ambassador is sent to a planet where the inhabitants are genderless and can change gender at will.", "Ursula K. Le Guin", 1969),
|
||||
("The Three-Body Problem", "Humans encounter an alien civilization that lives in a dying system.", "Liu Cixin", 2008),
|
||||
];
|
||||
|
||||
let embedding_model = "sentence-transformers/all-minilm-l6-v2";
|
||||
|
||||
let points: Vec<PointStruct> = documents
|
||||
.iter()
|
||||
.enumerate()
|
||||
.map(|(idx, (name, description, author, year))| {
|
||||
PointStruct::new(
|
||||
idx as u64,
|
||||
Document::new(*description, embedding_model),
|
||||
[
|
||||
("name", (*name).into()),
|
||||
("description", (*description).into()),
|
||||
("author", (*author).into()),
|
||||
("year", (*year).into()),
|
||||
],
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
|
||||
client
|
||||
.upsert_points(UpsertPointsBuilder::new(collection_name, points))
|
||||
.await?;
|
||||
|
||||
let query_result = client
|
||||
.query(
|
||||
QueryPointsBuilder::new(collection_name)
|
||||
.query(Query::new_nearest(Document::new(
|
||||
"alien invasion",
|
||||
embedding_model,
|
||||
)))
|
||||
.limit(3)
|
||||
.with_payload(true),
|
||||
)
|
||||
.await?;
|
||||
|
||||
for hit in query_result.result {
|
||||
println!("{:?} score: {}", hit.payload, hit.score);
|
||||
}
|
||||
|
||||
client
|
||||
.create_field_index(
|
||||
CreateFieldIndexCollectionBuilder::new(collection_name, "year", FieldType::Integer)
|
||||
.wait(true),
|
||||
)
|
||||
.await?;
|
||||
|
||||
let query_result_filtered = client
|
||||
.query(
|
||||
QueryPointsBuilder::new(collection_name)
|
||||
.query(Query::new_nearest(Document::new(
|
||||
"alien invasion",
|
||||
embedding_model,
|
||||
)))
|
||||
.filter(Filter::must([Condition::range(
|
||||
"year",
|
||||
Range {
|
||||
gte: Some(2000.0),
|
||||
..Default::default()
|
||||
},
|
||||
)]))
|
||||
.limit(1)
|
||||
.with_payload(true),
|
||||
)
|
||||
.await?;
|
||||
|
||||
for hit in query_result_filtered.result {
|
||||
println!("{:?} score: {}", hit.payload, hit.score);
|
||||
}
|
||||
```
|
||||
+85
@@ -0,0 +1,85 @@
|
||||
```typescript
|
||||
import { QdrantClient } from "@qdrant/js-client-rest";
|
||||
|
||||
const client = new QdrantClient({
|
||||
url: QDRANT_URL,
|
||||
apiKey: QDRANT_API_KEY,
|
||||
});
|
||||
|
||||
const collectionName = "my_books";
|
||||
|
||||
await client.createCollection(collectionName, {
|
||||
vectors: {
|
||||
size: 384, // Vector size is defined by used model
|
||||
distance: "Cosine",
|
||||
},
|
||||
});
|
||||
|
||||
const documents = [
|
||||
{ name: "The Time Machine", description: "A man travels through time and witnesses the evolution of humanity.", author: "H.G. Wells", year: 1895 },
|
||||
{ name: "Ender's Game", description: "A young boy is trained to become a military leader in a war against an alien race.", author: "Orson Scott Card", year: 1985 },
|
||||
{ name: "Brave New World", description: "A dystopian society where people are genetically engineered and conditioned to conform to a strict social hierarchy.", author: "Aldous Huxley", year: 1932 },
|
||||
{ name: "The Hitchhiker's Guide to the Galaxy", description: "A comedic science fiction series following the misadventures of an unwitting human and his alien friend.", author: "Douglas Adams", year: 1979 },
|
||||
{ name: "Dune", description: "A desert planet is the site of political intrigue and power struggles.", author: "Frank Herbert", year: 1965 },
|
||||
{ name: "Foundation", description: "A mathematician develops a science to predict the future of humanity and works to save civilization from collapse.", author: "Isaac Asimov", year: 1951 },
|
||||
{ name: "Snow Crash", description: "A futuristic world where the internet has evolved into a virtual reality metaverse.", author: "Neal Stephenson", year: 1992 },
|
||||
{ name: "Neuromancer", description: "A hacker is hired to pull off a near-impossible hack and gets pulled into a web of intrigue.", author: "William Gibson", year: 1984 },
|
||||
{ name: "The War of the Worlds", description: "A Martian invasion of Earth throws humanity into chaos.", author: "H.G. Wells", year: 1898 },
|
||||
{ name: "The Hunger Games", description: "A dystopian society where teenagers are forced to fight to the death in a televised spectacle.", author: "Suzanne Collins", year: 2008 },
|
||||
{ name: "The Andromeda Strain", description: "A deadly virus from outer space threatens to wipe out humanity.", author: "Michael Crichton", year: 1969 },
|
||||
{ name: "The Left Hand of Darkness", description: "A human ambassador is sent to a planet where the inhabitants are genderless and can change gender at will.", author: "Ursula K. Le Guin", year: 1969 },
|
||||
{ name: "The Three-Body Problem", description: "Humans encounter an alien civilization that lives in a dying system.", author: "Liu Cixin", year: 2008 },
|
||||
];
|
||||
|
||||
const embeddingModel = "sentence-transformers/all-minilm-l6-v2";
|
||||
|
||||
const points = documents.map((doc, idx) => ({
|
||||
id: idx,
|
||||
vector: {
|
||||
text: doc.description,
|
||||
model: embeddingModel,
|
||||
},
|
||||
payload: doc,
|
||||
}));
|
||||
|
||||
await client.upsert(collectionName, { points });
|
||||
|
||||
const queryResult = await client.query(collectionName, {
|
||||
query: {
|
||||
text: "alien invasion",
|
||||
model: embeddingModel,
|
||||
},
|
||||
limit: 3,
|
||||
});
|
||||
|
||||
for (const hit of queryResult.points) {
|
||||
console.log(hit.payload, "score:", hit.score);
|
||||
}
|
||||
|
||||
await client.createPayloadIndex(collectionName, {
|
||||
field_name: "year",
|
||||
field_schema: "integer",
|
||||
});
|
||||
|
||||
const queryResultFiltered = await client.query(collectionName, {
|
||||
query: {
|
||||
text: "alien invasion",
|
||||
model: embeddingModel,
|
||||
},
|
||||
filter: {
|
||||
must: [
|
||||
{
|
||||
key: "year",
|
||||
range: {
|
||||
gte: 2000,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
limit: 1,
|
||||
});
|
||||
|
||||
for (const hit of queryResultFiltered.points) {
|
||||
console.log(hit.payload, "score:", hit.score);
|
||||
}
|
||||
```
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
```csharp
|
||||
var payloads = new List<Dictionary<string, Value>>
|
||||
{
|
||||
new() { ["name"] = "The Time Machine", ["description"] = "A man travels through time and witnesses the evolution of humanity.", ["author"] = "H.G. Wells", ["year"] = 1895 },
|
||||
new() { ["name"] = "Ender's Game", ["description"] = "A young boy is trained to become a military leader in a war against an alien race.", ["author"] = "Orson Scott Card", ["year"] = 1985 },
|
||||
new() { ["name"] = "Brave New World", ["description"] = "A dystopian society where people are genetically engineered and conditioned to conform to a strict social hierarchy.", ["author"] = "Aldous Huxley", ["year"] = 1932 },
|
||||
new() { ["name"] = "The Hitchhiker's Guide to the Galaxy", ["description"] = "A comedic science fiction series following the misadventures of an unwitting human and his alien friend.", ["author"] = "Douglas Adams", ["year"] = 1979 },
|
||||
new() { ["name"] = "Dune", ["description"] = "A desert planet is the site of political intrigue and power struggles.", ["author"] = "Frank Herbert", ["year"] = 1965 },
|
||||
new() { ["name"] = "Foundation", ["description"] = "A mathematician develops a science to predict the future of humanity and works to save civilization from collapse.", ["author"] = "Isaac Asimov", ["year"] = 1951 },
|
||||
new() { ["name"] = "Snow Crash", ["description"] = "A futuristic world where the internet has evolved into a virtual reality metaverse.", ["author"] = "Neal Stephenson", ["year"] = 1992 },
|
||||
new() { ["name"] = "Neuromancer", ["description"] = "A hacker is hired to pull off a near-impossible hack and gets pulled into a web of intrigue.", ["author"] = "William Gibson", ["year"] = 1984 },
|
||||
new() { ["name"] = "The War of the Worlds", ["description"] = "A Martian invasion of Earth throws humanity into chaos.", ["author"] = "H.G. Wells", ["year"] = 1898 },
|
||||
new() { ["name"] = "The Hunger Games", ["description"] = "A dystopian society where teenagers are forced to fight to the death in a televised spectacle.", ["author"] = "Suzanne Collins", ["year"] = 2008 },
|
||||
new() { ["name"] = "The Andromeda Strain", ["description"] = "A deadly virus from outer space threatens to wipe out humanity.", ["author"] = "Michael Crichton", ["year"] = 1969 },
|
||||
new() { ["name"] = "The Left Hand of Darkness", ["description"] = "A human ambassador is sent to a planet where the inhabitants are genderless and can change gender at will.", ["author"] = "Ursula K. Le Guin", ["year"] = 1969 },
|
||||
new() { ["name"] = "The Three-Body Problem", ["description"] = "Humans encounter an alien civilization that lives in a dying system.", ["author"] = "Liu Cixin", ["year"] = 2008 }
|
||||
};
|
||||
```
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
```go
|
||||
documents := []map[string]any{
|
||||
{
|
||||
"name": "The Time Machine",
|
||||
"description": "A man travels through time and witnesses the evolution of humanity.",
|
||||
"author": "H.G. Wells",
|
||||
"year": 1895,
|
||||
},
|
||||
{
|
||||
"name": "Ender's Game",
|
||||
"description": "A young boy is trained to become a military leader in a war against an alien race.",
|
||||
"author": "Orson Scott Card",
|
||||
"year": 1985,
|
||||
},
|
||||
{
|
||||
"name": "Brave New World",
|
||||
"description": "A dystopian society where people are genetically engineered and conditioned to conform to a strict social hierarchy.",
|
||||
"author": "Aldous Huxley",
|
||||
"year": 1932,
|
||||
},
|
||||
{
|
||||
"name": "The Hitchhiker's Guide to the Galaxy",
|
||||
"description": "A comedic science fiction series following the misadventures of an unwitting human and his alien friend.",
|
||||
"author": "Douglas Adams",
|
||||
"year": 1979,
|
||||
},
|
||||
{
|
||||
"name": "Dune",
|
||||
"description": "A desert planet is the site of political intrigue and power struggles.",
|
||||
"author": "Frank Herbert",
|
||||
"year": 1965,
|
||||
},
|
||||
{
|
||||
"name": "Foundation",
|
||||
"description": "A mathematician develops a science to predict the future of humanity and works to save civilization from collapse.",
|
||||
"author": "Isaac Asimov",
|
||||
"year": 1951,
|
||||
},
|
||||
{
|
||||
"name": "Snow Crash",
|
||||
"description": "A futuristic world where the internet has evolved into a virtual reality metaverse.",
|
||||
"author": "Neal Stephenson",
|
||||
"year": 1992,
|
||||
},
|
||||
{
|
||||
"name": "Neuromancer",
|
||||
"description": "A hacker is hired to pull off a near-impossible hack and gets pulled into a web of intrigue.",
|
||||
"author": "William Gibson",
|
||||
"year": 1984,
|
||||
},
|
||||
{
|
||||
"name": "The War of the Worlds",
|
||||
"description": "A Martian invasion of Earth throws humanity into chaos.",
|
||||
"author": "H.G. Wells",
|
||||
"year": 1898,
|
||||
},
|
||||
{
|
||||
"name": "The Hunger Games",
|
||||
"description": "A dystopian society where teenagers are forced to fight to the death in a televised spectacle.",
|
||||
"author": "Suzanne Collins",
|
||||
"year": 2008,
|
||||
},
|
||||
{
|
||||
"name": "The Andromeda Strain",
|
||||
"description": "A deadly virus from outer space threatens to wipe out humanity.",
|
||||
"author": "Michael Crichton",
|
||||
"year": 1969,
|
||||
},
|
||||
{
|
||||
"name": "The Left Hand of Darkness",
|
||||
"description": "A human ambassador is sent to a planet where the inhabitants are genderless and can change gender at will.",
|
||||
"author": "Ursula K. Le Guin",
|
||||
"year": 1969,
|
||||
},
|
||||
{
|
||||
"name": "The Three-Body Problem",
|
||||
"description": "Humans encounter an alien civilization that lives in a dying system.",
|
||||
"author": "Liu Cixin",
|
||||
"year": 2008,
|
||||
},
|
||||
}
|
||||
```
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
```java
|
||||
List<Map<String, Value>> payloads = List.of(
|
||||
Map.of(
|
||||
"name", value("The Time Machine"),
|
||||
"description", value("A man travels through time and witnesses the evolution of humanity."),
|
||||
"author", value("H.G. Wells"),
|
||||
"year", value(1895)),
|
||||
Map.of(
|
||||
"name", value("Ender's Game"),
|
||||
"description",
|
||||
value("A young boy is trained to become a military leader in a war against an alien race."),
|
||||
"author", value("Orson Scott Card"),
|
||||
"year", value(1985)),
|
||||
Map.of(
|
||||
"name", value("Brave New World"),
|
||||
"description",
|
||||
value(
|
||||
"A dystopian society where people are genetically engineered and conditioned to conform to a strict social hierarchy."),
|
||||
"author", value("Aldous Huxley"),
|
||||
"year", value(1932)),
|
||||
Map.of(
|
||||
"name", value("The Hitchhiker's Guide to the Galaxy"),
|
||||
"description",
|
||||
value(
|
||||
"A comedic science fiction series following the misadventures of an unwitting human and his alien friend."),
|
||||
"author", value("Douglas Adams"),
|
||||
"year", value(1979)),
|
||||
Map.of(
|
||||
"name", value("Dune"),
|
||||
"description", value("A desert planet is the site of political intrigue and power struggles."),
|
||||
"author", value("Frank Herbert"),
|
||||
"year", value(1965)),
|
||||
Map.of(
|
||||
"name", value("Foundation"),
|
||||
"description",
|
||||
value(
|
||||
"A mathematician develops a science to predict the future of humanity and works to save civilization from collapse."),
|
||||
"author", value("Isaac Asimov"),
|
||||
"year", value(1951)),
|
||||
Map.of(
|
||||
"name", value("Snow Crash"),
|
||||
"description",
|
||||
value("A futuristic world where the internet has evolved into a virtual reality metaverse."),
|
||||
"author", value("Neal Stephenson"),
|
||||
"year", value(1992)),
|
||||
Map.of(
|
||||
"name", value("Neuromancer"),
|
||||
"description",
|
||||
value(
|
||||
"A hacker is hired to pull off a near-impossible hack and gets pulled into a web of intrigue."),
|
||||
"author", value("William Gibson"),
|
||||
"year", value(1984)),
|
||||
Map.of(
|
||||
"name", value("The War of the Worlds"),
|
||||
"description", value("A Martian invasion of Earth throws humanity into chaos."),
|
||||
"author", value("H.G. Wells"),
|
||||
"year", value(1898)),
|
||||
Map.of(
|
||||
"name", value("The Hunger Games"),
|
||||
"description",
|
||||
value("A dystopian society where teenagers are forced to fight to the death in a televised spectacle."),
|
||||
"author", value("Suzanne Collins"),
|
||||
"year", value(2008)),
|
||||
Map.of(
|
||||
"name", value("The Andromeda Strain"),
|
||||
"description", value("A deadly virus from outer space threatens to wipe out humanity."),
|
||||
"author", value("Michael Crichton"),
|
||||
"year", value(1969)),
|
||||
Map.of(
|
||||
"name", value("The Left Hand of Darkness"),
|
||||
"description",
|
||||
value(
|
||||
"A human ambassador is sent to a planet where the inhabitants are genderless and can change gender at will."),
|
||||
"author", value("Ursula K. Le Guin"),
|
||||
"year", value(1969)),
|
||||
Map.of(
|
||||
"name", value("The Three-Body Problem"),
|
||||
"description", value("Humans encounter an alien civilization that lives in a dying system."),
|
||||
"author", value("Liu Cixin"),
|
||||
"year", value(2008)));
|
||||
```
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
```rust
|
||||
let documents = [
|
||||
("The Time Machine", "A man travels through time and witnesses the evolution of humanity.", "H.G. Wells", 1895),
|
||||
("Ender's Game", "A young boy is trained to become a military leader in a war against an alien race.", "Orson Scott Card", 1985),
|
||||
("Brave New World", "A dystopian society where people are genetically engineered and conditioned to conform to a strict social hierarchy.", "Aldous Huxley", 1932),
|
||||
("The Hitchhiker's Guide to the Galaxy", "A comedic science fiction series following the misadventures of an unwitting human and his alien friend.", "Douglas Adams", 1979),
|
||||
("Dune", "A desert planet is the site of political intrigue and power struggles.", "Frank Herbert", 1965),
|
||||
("Foundation", "A mathematician develops a science to predict the future of humanity and works to save civilization from collapse.", "Isaac Asimov", 1951),
|
||||
("Snow Crash", "A futuristic world where the internet has evolved into a virtual reality metaverse.", "Neal Stephenson", 1992),
|
||||
("Neuromancer", "A hacker is hired to pull off a near-impossible hack and gets pulled into a web of intrigue.", "William Gibson", 1984),
|
||||
("The War of the Worlds", "A Martian invasion of Earth throws humanity into chaos.", "H.G. Wells", 1898),
|
||||
("The Hunger Games", "A dystopian society where teenagers are forced to fight to the death in a televised spectacle.", "Suzanne Collins", 2008),
|
||||
("The Andromeda Strain", "A deadly virus from outer space threatens to wipe out humanity.", "Michael Crichton", 1969),
|
||||
("The Left Hand of Darkness", "A human ambassador is sent to a planet where the inhabitants are genderless and can change gender at will.", "Ursula K. Le Guin", 1969),
|
||||
("The Three-Body Problem", "Humans encounter an alien civilization that lives in a dying system.", "Liu Cixin", 2008),
|
||||
];
|
||||
```
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
```typescript
|
||||
const documents = [
|
||||
{ name: "The Time Machine", description: "A man travels through time and witnesses the evolution of humanity.", author: "H.G. Wells", year: 1895 },
|
||||
{ name: "Ender's Game", description: "A young boy is trained to become a military leader in a war against an alien race.", author: "Orson Scott Card", year: 1985 },
|
||||
{ name: "Brave New World", description: "A dystopian society where people are genetically engineered and conditioned to conform to a strict social hierarchy.", author: "Aldous Huxley", year: 1932 },
|
||||
{ name: "The Hitchhiker's Guide to the Galaxy", description: "A comedic science fiction series following the misadventures of an unwitting human and his alien friend.", author: "Douglas Adams", year: 1979 },
|
||||
{ name: "Dune", description: "A desert planet is the site of political intrigue and power struggles.", author: "Frank Herbert", year: 1965 },
|
||||
{ name: "Foundation", description: "A mathematician develops a science to predict the future of humanity and works to save civilization from collapse.", author: "Isaac Asimov", year: 1951 },
|
||||
{ name: "Snow Crash", description: "A futuristic world where the internet has evolved into a virtual reality metaverse.", author: "Neal Stephenson", year: 1992 },
|
||||
{ name: "Neuromancer", description: "A hacker is hired to pull off a near-impossible hack and gets pulled into a web of intrigue.", author: "William Gibson", year: 1984 },
|
||||
{ name: "The War of the Worlds", description: "A Martian invasion of Earth throws humanity into chaos.", author: "H.G. Wells", year: 1898 },
|
||||
{ name: "The Hunger Games", description: "A dystopian society where teenagers are forced to fight to the death in a televised spectacle.", author: "Suzanne Collins", year: 2008 },
|
||||
{ name: "The Andromeda Strain", description: "A deadly virus from outer space threatens to wipe out humanity.", author: "Michael Crichton", year: 1969 },
|
||||
{ name: "The Left Hand of Darkness", description: "A human ambassador is sent to a planet where the inhabitants are genderless and can change gender at will.", author: "Ursula K. Le Guin", year: 1969 },
|
||||
{ name: "The Three-Body Problem", description: "Humans encounter an alien civilization that lives in a dying system.", author: "Liu Cixin", year: 2008 },
|
||||
];
|
||||
```
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
```csharp
|
||||
string EMBEDDING_MODEL = "sentence-transformers/all-minilm-l6-v2";
|
||||
|
||||
var points = new List<PointStruct>();
|
||||
|
||||
for (ulong idx = 0; idx < (ulong)payloads.Count; idx++)
|
||||
{
|
||||
var payload = payloads[(int)idx];
|
||||
string description = payload["description"].StringValue;
|
||||
|
||||
var point = new PointStruct
|
||||
{
|
||||
Id = idx,
|
||||
Vectors = new Document
|
||||
{
|
||||
Text = description,
|
||||
Model = EMBEDDING_MODEL
|
||||
},
|
||||
Payload = { payload }
|
||||
};
|
||||
|
||||
points.Add(point);
|
||||
}
|
||||
|
||||
await client.UpsertAsync(
|
||||
collectionName: COLLECTION_NAME,
|
||||
points: points
|
||||
);
|
||||
```
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
```go
|
||||
embeddingModel := "sentence-transformers/all-minilm-l6-v2"
|
||||
|
||||
points := make([]*qdrant.PointStruct, len(documents))
|
||||
for idx, doc := range documents {
|
||||
points[idx] = &qdrant.PointStruct{
|
||||
Id: qdrant.NewIDNum(uint64(idx)),
|
||||
Vectors: qdrant.NewVectorsDocument(&qdrant.Document{
|
||||
Text: doc["description"].(string),
|
||||
Model: embeddingModel,
|
||||
}),
|
||||
Payload: qdrant.NewValueMap(doc),
|
||||
}
|
||||
}
|
||||
|
||||
client.Upsert(context.Background(), &qdrant.UpsertPoints{
|
||||
CollectionName: collectionName,
|
||||
Points: points,
|
||||
})
|
||||
```
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
```java
|
||||
String EMBEDDING_MODEL = "sentence-transformers/all-minilm-l6-v2";
|
||||
|
||||
List<PointStruct> points = new ArrayList<>();
|
||||
|
||||
for (int idx = 0; idx < payloads.size(); idx++) {
|
||||
Map<String, Value> payload = payloads.get(idx);
|
||||
String description = payload.get("description").getStringValue();
|
||||
|
||||
PointStruct point =
|
||||
PointStruct.newBuilder()
|
||||
.setId(id((long) idx))
|
||||
.setVectors(
|
||||
vectors(
|
||||
vector(
|
||||
Document.newBuilder()
|
||||
.setText(description)
|
||||
.setModel(EMBEDDING_MODEL)
|
||||
.build())))
|
||||
.putAllPayload(payload)
|
||||
.build();
|
||||
|
||||
points.add(point);
|
||||
}
|
||||
|
||||
client.upsertAsync(COLLECTION_NAME, points).get();
|
||||
```
|
||||
+1
-2
@@ -1,5 +1,4 @@
|
||||
```python
|
||||
# Define the embedding model used by Cloud Inference
|
||||
EMBEDDING_MODEL="sentence-transformers/all-minilm-l6-v2"
|
||||
|
||||
client.upload_points(
|
||||
@@ -9,7 +8,7 @@ client.upload_points(
|
||||
id=idx,
|
||||
vector=models.Document(
|
||||
text=doc["description"],
|
||||
model=EMBEDDING_MODEL # Cloud Inference generates embeddings with this model
|
||||
model=EMBEDDING_MODEL
|
||||
),
|
||||
payload=doc
|
||||
)
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
```rust
|
||||
let embedding_model = "sentence-transformers/all-minilm-l6-v2";
|
||||
|
||||
let points: Vec<PointStruct> = documents
|
||||
.iter()
|
||||
.enumerate()
|
||||
.map(|(idx, (name, description, author, year))| {
|
||||
PointStruct::new(
|
||||
idx as u64,
|
||||
Document::new(*description, embedding_model),
|
||||
[
|
||||
("name", (*name).into()),
|
||||
("description", (*description).into()),
|
||||
("author", (*author).into()),
|
||||
("year", (*year).into()),
|
||||
],
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
|
||||
client
|
||||
.upsert_points(UpsertPointsBuilder::new(collection_name, points))
|
||||
.await?;
|
||||
```
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
```typescript
|
||||
const embeddingModel = "sentence-transformers/all-minilm-l6-v2";
|
||||
|
||||
const points = documents.map((doc, idx) => ({
|
||||
id: idx,
|
||||
vector: {
|
||||
text: doc.description,
|
||||
model: embeddingModel,
|
||||
},
|
||||
payload: doc,
|
||||
}));
|
||||
|
||||
await client.upsert(collectionName, { points });
|
||||
```
|
||||
+201
@@ -0,0 +1,201 @@
|
||||
package snippet
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/qdrant/go-client/qdrant"
|
||||
)
|
||||
|
||||
func Main() {
|
||||
// @hide-start
|
||||
QDRANT_URL := ""
|
||||
QDRANT_API_KEY := ""
|
||||
// @hide-end
|
||||
// @block-start client-connection
|
||||
client, err := qdrant.NewClient(&qdrant.Config{
|
||||
Host: QDRANT_URL,
|
||||
APIKey: QDRANT_API_KEY,
|
||||
UseTLS: true,
|
||||
})
|
||||
// @block-end client-connection
|
||||
|
||||
// @hide-start
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
// @hide-end
|
||||
|
||||
// @block-start create-collection
|
||||
collectionName := "my_books"
|
||||
|
||||
client.CreateCollection(context.Background(), &qdrant.CreateCollection{
|
||||
CollectionName: collectionName,
|
||||
VectorsConfig: qdrant.NewVectorsConfig(&qdrant.VectorParams{
|
||||
Size: 384, // Vector size is defined by used model
|
||||
Distance: qdrant.Distance_Cosine,
|
||||
}),
|
||||
})
|
||||
// @block-end create-collection
|
||||
|
||||
// @block-start upload-data
|
||||
documents := []map[string]any{
|
||||
{
|
||||
"name": "The Time Machine",
|
||||
"description": "A man travels through time and witnesses the evolution of humanity.",
|
||||
"author": "H.G. Wells",
|
||||
"year": 1895,
|
||||
},
|
||||
{
|
||||
"name": "Ender's Game",
|
||||
"description": "A young boy is trained to become a military leader in a war against an alien race.",
|
||||
"author": "Orson Scott Card",
|
||||
"year": 1985,
|
||||
},
|
||||
{
|
||||
"name": "Brave New World",
|
||||
"description": "A dystopian society where people are genetically engineered and conditioned to conform to a strict social hierarchy.",
|
||||
"author": "Aldous Huxley",
|
||||
"year": 1932,
|
||||
},
|
||||
{
|
||||
"name": "The Hitchhiker's Guide to the Galaxy",
|
||||
"description": "A comedic science fiction series following the misadventures of an unwitting human and his alien friend.",
|
||||
"author": "Douglas Adams",
|
||||
"year": 1979,
|
||||
},
|
||||
{
|
||||
"name": "Dune",
|
||||
"description": "A desert planet is the site of political intrigue and power struggles.",
|
||||
"author": "Frank Herbert",
|
||||
"year": 1965,
|
||||
},
|
||||
{
|
||||
"name": "Foundation",
|
||||
"description": "A mathematician develops a science to predict the future of humanity and works to save civilization from collapse.",
|
||||
"author": "Isaac Asimov",
|
||||
"year": 1951,
|
||||
},
|
||||
{
|
||||
"name": "Snow Crash",
|
||||
"description": "A futuristic world where the internet has evolved into a virtual reality metaverse.",
|
||||
"author": "Neal Stephenson",
|
||||
"year": 1992,
|
||||
},
|
||||
{
|
||||
"name": "Neuromancer",
|
||||
"description": "A hacker is hired to pull off a near-impossible hack and gets pulled into a web of intrigue.",
|
||||
"author": "William Gibson",
|
||||
"year": 1984,
|
||||
},
|
||||
{
|
||||
"name": "The War of the Worlds",
|
||||
"description": "A Martian invasion of Earth throws humanity into chaos.",
|
||||
"author": "H.G. Wells",
|
||||
"year": 1898,
|
||||
},
|
||||
{
|
||||
"name": "The Hunger Games",
|
||||
"description": "A dystopian society where teenagers are forced to fight to the death in a televised spectacle.",
|
||||
"author": "Suzanne Collins",
|
||||
"year": 2008,
|
||||
},
|
||||
{
|
||||
"name": "The Andromeda Strain",
|
||||
"description": "A deadly virus from outer space threatens to wipe out humanity.",
|
||||
"author": "Michael Crichton",
|
||||
"year": 1969,
|
||||
},
|
||||
{
|
||||
"name": "The Left Hand of Darkness",
|
||||
"description": "A human ambassador is sent to a planet where the inhabitants are genderless and can change gender at will.",
|
||||
"author": "Ursula K. Le Guin",
|
||||
"year": 1969,
|
||||
},
|
||||
{
|
||||
"name": "The Three-Body Problem",
|
||||
"description": "Humans encounter an alien civilization that lives in a dying system.",
|
||||
"author": "Liu Cixin",
|
||||
"year": 2008,
|
||||
},
|
||||
}
|
||||
// @block-end upload-data
|
||||
|
||||
// @block-start upload-points
|
||||
embeddingModel := "sentence-transformers/all-minilm-l6-v2"
|
||||
|
||||
points := make([]*qdrant.PointStruct, len(documents))
|
||||
for idx, doc := range documents {
|
||||
points[idx] = &qdrant.PointStruct{
|
||||
Id: qdrant.NewIDNum(uint64(idx)),
|
||||
Vectors: qdrant.NewVectorsDocument(&qdrant.Document{
|
||||
Text: doc["description"].(string),
|
||||
Model: embeddingModel,
|
||||
}),
|
||||
Payload: qdrant.NewValueMap(doc),
|
||||
}
|
||||
}
|
||||
|
||||
client.Upsert(context.Background(), &qdrant.UpsertPoints{
|
||||
CollectionName: collectionName,
|
||||
Points: points,
|
||||
})
|
||||
// @block-end upload-points
|
||||
|
||||
// @block-start query-engine
|
||||
queryResult, err := client.Query(context.Background(), &qdrant.QueryPoints{
|
||||
CollectionName: collectionName,
|
||||
Query: qdrant.NewQueryDocument(&qdrant.Document{
|
||||
Text: "alien invasion",
|
||||
Model: embeddingModel,
|
||||
}),
|
||||
Limit: qdrant.PtrOf(uint64(3)),
|
||||
})
|
||||
|
||||
// @hide-start
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
// @hide-end
|
||||
|
||||
for _, hit := range queryResult {
|
||||
fmt.Println(hit.Payload, "score:", hit.Score)
|
||||
}
|
||||
// @block-end query-engine
|
||||
|
||||
// @block-start create-payload-index
|
||||
client.CreateFieldIndex(context.Background(), &qdrant.CreateFieldIndexCollection{
|
||||
CollectionName: collectionName,
|
||||
FieldName: "year",
|
||||
FieldType: qdrant.FieldType_FieldTypeInteger.Enum(),
|
||||
})
|
||||
// @block-end create-payload-index
|
||||
|
||||
// @block-start query-with-filter
|
||||
queryResultFiltered, err := client.Query(context.Background(), &qdrant.QueryPoints{
|
||||
CollectionName: collectionName,
|
||||
Query: qdrant.NewQueryDocument(&qdrant.Document{
|
||||
Text: "alien invasion",
|
||||
Model: embeddingModel,
|
||||
}),
|
||||
Filter: &qdrant.Filter{
|
||||
Must: []*qdrant.Condition{
|
||||
qdrant.NewRange("year", &qdrant.Range{
|
||||
Gte: qdrant.PtrOf(2000.0),
|
||||
}),
|
||||
},
|
||||
},
|
||||
Limit: qdrant.PtrOf(uint64(1)),
|
||||
})
|
||||
|
||||
// @hide-start
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
// @hide-end
|
||||
|
||||
for _, hit := range queryResultFiltered {
|
||||
fmt.Println(hit.Payload, "score:", hit.Score)
|
||||
}
|
||||
// @block-end query-with-filter
|
||||
}
|
||||
+214
@@ -0,0 +1,214 @@
|
||||
package com.example.snippets_amalgamation;
|
||||
|
||||
import static io.qdrant.client.ConditionFactory.range;
|
||||
import static io.qdrant.client.PointIdFactory.id;
|
||||
import static io.qdrant.client.QueryFactory.nearest;
|
||||
import static io.qdrant.client.ValueFactory.value;
|
||||
import static io.qdrant.client.VectorFactory.vector;
|
||||
import static io.qdrant.client.VectorsFactory.vectors;
|
||||
|
||||
import io.qdrant.client.QdrantClient;
|
||||
import io.qdrant.client.QdrantGrpcClient;
|
||||
import io.qdrant.client.grpc.Collections.Distance;
|
||||
import io.qdrant.client.grpc.Collections.PayloadSchemaType;
|
||||
import io.qdrant.client.grpc.Collections.VectorParams;
|
||||
import io.qdrant.client.grpc.Common.Filter;
|
||||
import io.qdrant.client.grpc.Common.Range;
|
||||
import io.qdrant.client.grpc.JsonWithInt.Value;
|
||||
import io.qdrant.client.grpc.Points.Document;
|
||||
import io.qdrant.client.grpc.Points.PointStruct;
|
||||
import io.qdrant.client.grpc.Points.QueryPoints;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class Snippet {
|
||||
|
||||
public static void run() throws Exception {
|
||||
// @hide-start
|
||||
String QDRANT_URL = "";
|
||||
String QDRANT_API_KEY = "";
|
||||
// @hide-end
|
||||
// @block-start client-connection
|
||||
QdrantClient client =
|
||||
new QdrantClient(
|
||||
QdrantGrpcClient.newBuilder(QDRANT_URL, 6334, true)
|
||||
.withApiKey(QDRANT_API_KEY)
|
||||
.build());
|
||||
// @block-end client-connection
|
||||
|
||||
// @block-start create-collection
|
||||
String COLLECTION_NAME = "my_books";
|
||||
|
||||
client.createCollectionAsync(COLLECTION_NAME,
|
||||
VectorParams.newBuilder().setDistance(Distance.Cosine).setSize(384).build()).get();
|
||||
// @block-end create-collection
|
||||
|
||||
// @block-start upload-data
|
||||
List<Map<String, Value>> payloads = List.of(
|
||||
Map.of(
|
||||
"name", value("The Time Machine"),
|
||||
"description", value("A man travels through time and witnesses the evolution of humanity."),
|
||||
"author", value("H.G. Wells"),
|
||||
"year", value(1895)),
|
||||
Map.of(
|
||||
"name", value("Ender's Game"),
|
||||
"description",
|
||||
value("A young boy is trained to become a military leader in a war against an alien race."),
|
||||
"author", value("Orson Scott Card"),
|
||||
"year", value(1985)),
|
||||
Map.of(
|
||||
"name", value("Brave New World"),
|
||||
"description",
|
||||
value(
|
||||
"A dystopian society where people are genetically engineered and conditioned to conform to a strict social hierarchy."),
|
||||
"author", value("Aldous Huxley"),
|
||||
"year", value(1932)),
|
||||
Map.of(
|
||||
"name", value("The Hitchhiker's Guide to the Galaxy"),
|
||||
"description",
|
||||
value(
|
||||
"A comedic science fiction series following the misadventures of an unwitting human and his alien friend."),
|
||||
"author", value("Douglas Adams"),
|
||||
"year", value(1979)),
|
||||
Map.of(
|
||||
"name", value("Dune"),
|
||||
"description", value("A desert planet is the site of political intrigue and power struggles."),
|
||||
"author", value("Frank Herbert"),
|
||||
"year", value(1965)),
|
||||
Map.of(
|
||||
"name", value("Foundation"),
|
||||
"description",
|
||||
value(
|
||||
"A mathematician develops a science to predict the future of humanity and works to save civilization from collapse."),
|
||||
"author", value("Isaac Asimov"),
|
||||
"year", value(1951)),
|
||||
Map.of(
|
||||
"name", value("Snow Crash"),
|
||||
"description",
|
||||
value("A futuristic world where the internet has evolved into a virtual reality metaverse."),
|
||||
"author", value("Neal Stephenson"),
|
||||
"year", value(1992)),
|
||||
Map.of(
|
||||
"name", value("Neuromancer"),
|
||||
"description",
|
||||
value(
|
||||
"A hacker is hired to pull off a near-impossible hack and gets pulled into a web of intrigue."),
|
||||
"author", value("William Gibson"),
|
||||
"year", value(1984)),
|
||||
Map.of(
|
||||
"name", value("The War of the Worlds"),
|
||||
"description", value("A Martian invasion of Earth throws humanity into chaos."),
|
||||
"author", value("H.G. Wells"),
|
||||
"year", value(1898)),
|
||||
Map.of(
|
||||
"name", value("The Hunger Games"),
|
||||
"description",
|
||||
value("A dystopian society where teenagers are forced to fight to the death in a televised spectacle."),
|
||||
"author", value("Suzanne Collins"),
|
||||
"year", value(2008)),
|
||||
Map.of(
|
||||
"name", value("The Andromeda Strain"),
|
||||
"description", value("A deadly virus from outer space threatens to wipe out humanity."),
|
||||
"author", value("Michael Crichton"),
|
||||
"year", value(1969)),
|
||||
Map.of(
|
||||
"name", value("The Left Hand of Darkness"),
|
||||
"description",
|
||||
value(
|
||||
"A human ambassador is sent to a planet where the inhabitants are genderless and can change gender at will."),
|
||||
"author", value("Ursula K. Le Guin"),
|
||||
"year", value(1969)),
|
||||
Map.of(
|
||||
"name", value("The Three-Body Problem"),
|
||||
"description", value("Humans encounter an alien civilization that lives in a dying system."),
|
||||
"author", value("Liu Cixin"),
|
||||
"year", value(2008)));
|
||||
// @block-end upload-data
|
||||
|
||||
// @block-start upload-points
|
||||
String EMBEDDING_MODEL = "sentence-transformers/all-minilm-l6-v2";
|
||||
|
||||
List<PointStruct> points = new ArrayList<>();
|
||||
|
||||
for (int idx = 0; idx < payloads.size(); idx++) {
|
||||
Map<String, Value> payload = payloads.get(idx);
|
||||
String description = payload.get("description").getStringValue();
|
||||
|
||||
PointStruct point =
|
||||
PointStruct.newBuilder()
|
||||
.setId(id((long) idx))
|
||||
.setVectors(
|
||||
vectors(
|
||||
vector(
|
||||
Document.newBuilder()
|
||||
.setText(description)
|
||||
.setModel(EMBEDDING_MODEL)
|
||||
.build())))
|
||||
.putAllPayload(payload)
|
||||
.build();
|
||||
|
||||
points.add(point);
|
||||
}
|
||||
|
||||
client.upsertAsync(COLLECTION_NAME, points).get();
|
||||
// @block-end upload-points
|
||||
|
||||
// @block-start query-engine
|
||||
QueryPoints request =
|
||||
QueryPoints.newBuilder()
|
||||
.setCollectionName(COLLECTION_NAME)
|
||||
.setQuery(
|
||||
nearest(
|
||||
Document.newBuilder()
|
||||
.setText("alien invasion")
|
||||
.setModel(EMBEDDING_MODEL)
|
||||
.build()))
|
||||
.setLimit(3)
|
||||
.build();
|
||||
|
||||
var hits = client.queryAsync(request).get();
|
||||
|
||||
for (var hit : hits) {
|
||||
System.out.println(hit.getPayloadMap() + " score: " + hit.getScore());
|
||||
}
|
||||
// @block-end query-engine
|
||||
|
||||
// @block-start create-payload-index
|
||||
client
|
||||
.createPayloadIndexAsync(
|
||||
COLLECTION_NAME,
|
||||
"year",
|
||||
PayloadSchemaType.Integer,
|
||||
null,
|
||||
true,
|
||||
null,
|
||||
null)
|
||||
.get();
|
||||
// @block-end create-payload-index
|
||||
|
||||
// @block-start query-with-filter
|
||||
QueryPoints filteredRequest =
|
||||
QueryPoints.newBuilder()
|
||||
.setCollectionName(COLLECTION_NAME)
|
||||
.setQuery(
|
||||
nearest(
|
||||
Document.newBuilder()
|
||||
.setText("alien invasion")
|
||||
.setModel(EMBEDDING_MODEL)
|
||||
.build()))
|
||||
.setFilter(
|
||||
Filter.newBuilder()
|
||||
.addMust(range("year", Range.newBuilder().setGte(2000.0).build()))
|
||||
.build())
|
||||
.setLimit(1)
|
||||
.build();
|
||||
|
||||
var filteredHits = client.queryAsync(filteredRequest).get();
|
||||
|
||||
for (var hit : filteredHits) {
|
||||
System.out.println(hit.getPayloadMap() + " score: " + hit.getScore());
|
||||
}
|
||||
// @block-end query-with-filter
|
||||
}
|
||||
}
|
||||
+167
@@ -0,0 +1,167 @@
|
||||
# @hide-start
|
||||
# mypy: disable-error-code="arg-type"
|
||||
QDRANT_URL=""
|
||||
QDRANT_API_KEY=""
|
||||
# @hide-end
|
||||
# @block-start client-connection
|
||||
from qdrant_client import QdrantClient, models
|
||||
|
||||
client = QdrantClient(
|
||||
url=QDRANT_URL,
|
||||
api_key=QDRANT_API_KEY,
|
||||
cloud_inference=True
|
||||
)
|
||||
# @block-end client-connection
|
||||
|
||||
# @block-start create-collection
|
||||
COLLECTION_NAME="my_books"
|
||||
|
||||
client.create_collection(
|
||||
collection_name=COLLECTION_NAME,
|
||||
vectors_config=models.VectorParams(
|
||||
size=384, # Vector size is defined by used model
|
||||
distance=models.Distance.COSINE,
|
||||
),
|
||||
)
|
||||
# @block-end create-collection
|
||||
|
||||
# @block-start upload-data
|
||||
documents = [
|
||||
{
|
||||
"name": "The Time Machine",
|
||||
"description": "A man travels through time and witnesses the evolution of humanity.",
|
||||
"author": "H.G. Wells",
|
||||
"year": 1895,
|
||||
},
|
||||
{
|
||||
"name": "Ender's Game",
|
||||
"description": "A young boy is trained to become a military leader in a war against an alien race.",
|
||||
"author": "Orson Scott Card",
|
||||
"year": 1985,
|
||||
},
|
||||
{
|
||||
"name": "Brave New World",
|
||||
"description": "A dystopian society where people are genetically engineered and conditioned to conform to a strict social hierarchy.",
|
||||
"author": "Aldous Huxley",
|
||||
"year": 1932,
|
||||
},
|
||||
{
|
||||
"name": "The Hitchhiker's Guide to the Galaxy",
|
||||
"description": "A comedic science fiction series following the misadventures of an unwitting human and his alien friend.",
|
||||
"author": "Douglas Adams",
|
||||
"year": 1979,
|
||||
},
|
||||
{
|
||||
"name": "Dune",
|
||||
"description": "A desert planet is the site of political intrigue and power struggles.",
|
||||
"author": "Frank Herbert",
|
||||
"year": 1965,
|
||||
},
|
||||
{
|
||||
"name": "Foundation",
|
||||
"description": "A mathematician develops a science to predict the future of humanity and works to save civilization from collapse.",
|
||||
"author": "Isaac Asimov",
|
||||
"year": 1951,
|
||||
},
|
||||
{
|
||||
"name": "Snow Crash",
|
||||
"description": "A futuristic world where the internet has evolved into a virtual reality metaverse.",
|
||||
"author": "Neal Stephenson",
|
||||
"year": 1992,
|
||||
},
|
||||
{
|
||||
"name": "Neuromancer",
|
||||
"description": "A hacker is hired to pull off a near-impossible hack and gets pulled into a web of intrigue.",
|
||||
"author": "William Gibson",
|
||||
"year": 1984,
|
||||
},
|
||||
{
|
||||
"name": "The War of the Worlds",
|
||||
"description": "A Martian invasion of Earth throws humanity into chaos.",
|
||||
"author": "H.G. Wells",
|
||||
"year": 1898,
|
||||
},
|
||||
{
|
||||
"name": "The Hunger Games",
|
||||
"description": "A dystopian society where teenagers are forced to fight to the death in a televised spectacle.",
|
||||
"author": "Suzanne Collins",
|
||||
"year": 2008,
|
||||
},
|
||||
{
|
||||
"name": "The Andromeda Strain",
|
||||
"description": "A deadly virus from outer space threatens to wipe out humanity.",
|
||||
"author": "Michael Crichton",
|
||||
"year": 1969,
|
||||
},
|
||||
{
|
||||
"name": "The Left Hand of Darkness",
|
||||
"description": "A human ambassador is sent to a planet where the inhabitants are genderless and can change gender at will.",
|
||||
"author": "Ursula K. Le Guin",
|
||||
"year": 1969,
|
||||
},
|
||||
{
|
||||
"name": "The Three-Body Problem",
|
||||
"description": "Humans encounter an alien civilization that lives in a dying system.",
|
||||
"author": "Liu Cixin",
|
||||
"year": 2008,
|
||||
},
|
||||
]
|
||||
# @block-end upload-data
|
||||
|
||||
# @block-start upload-points
|
||||
EMBEDDING_MODEL="sentence-transformers/all-minilm-l6-v2"
|
||||
|
||||
client.upload_points(
|
||||
collection_name=COLLECTION_NAME,
|
||||
points=[
|
||||
models.PointStruct(
|
||||
id=idx,
|
||||
vector=models.Document(
|
||||
text=doc["description"],
|
||||
model=EMBEDDING_MODEL
|
||||
),
|
||||
payload=doc
|
||||
)
|
||||
for idx, doc in enumerate(documents)
|
||||
],
|
||||
)
|
||||
# @block-end upload-points
|
||||
|
||||
# @block-start query-engine
|
||||
hits = client.query_points(
|
||||
collection_name=COLLECTION_NAME,
|
||||
query=models.Document(
|
||||
text="alien invasion",
|
||||
model=EMBEDDING_MODEL
|
||||
),
|
||||
limit=3,
|
||||
).points
|
||||
|
||||
for hit in hits:
|
||||
print(hit.payload, "score:", hit.score)
|
||||
# @block-end query-engine
|
||||
|
||||
# @block-start create-payload-index
|
||||
client.create_payload_index(
|
||||
collection_name=COLLECTION_NAME,
|
||||
field_name="year",
|
||||
field_schema=models.PayloadSchemaType.INTEGER,
|
||||
)
|
||||
# @block-end create-payload-index
|
||||
|
||||
# @block-start query-with-filter
|
||||
hits = client.query_points(
|
||||
collection_name=COLLECTION_NAME,
|
||||
query=models.Document(
|
||||
text="alien invasion",
|
||||
model=EMBEDDING_MODEL
|
||||
),
|
||||
query_filter=models.Filter(
|
||||
must=[models.FieldCondition(key="year", range=models.Range(gte=2000))]
|
||||
),
|
||||
limit=1,
|
||||
).points
|
||||
|
||||
for hit in hits:
|
||||
print(hit.payload, "score:", hit.score)
|
||||
# @block-end query-with-filter
|
||||
-1
@@ -1 +0,0 @@
|
||||
This code snippet shows how to query a collection using inference at query time. Instead of providing an explicit query vector, the example uses a `Document` object with query text and a model name. Qdrant generates embeddings from the text and performs a semantic search to find the three most similar books, returning their payloads and similarity scores.
|
||||
-24
@@ -1,24 +0,0 @@
|
||||
# @hide-start
|
||||
from qdrant_client import QdrantClient, models
|
||||
|
||||
client = QdrantClient(
|
||||
url="",
|
||||
api_key="",
|
||||
cloud_inference=True
|
||||
)
|
||||
|
||||
COLLECTION_NAME=""
|
||||
EMBEDDING_MODEL=""
|
||||
# @hide-end
|
||||
|
||||
hits = client.query_points(
|
||||
collection_name=COLLECTION_NAME,
|
||||
query=models.Document(
|
||||
text="alien invasion",
|
||||
model=EMBEDDING_MODEL
|
||||
),
|
||||
limit=3,
|
||||
).points
|
||||
|
||||
for hit in hits:
|
||||
print(hit.payload, "score:", hit.score)
|
||||
-1
@@ -1 +0,0 @@
|
||||
This code snippet demonstrates how to query a collection with a filter. The example uses inference to generate query embeddings and applies a filter to return only books published after the year 2000, limiting the results to the single most relevant match.
|
||||
-27
@@ -1,27 +0,0 @@
|
||||
# @hide-start
|
||||
from qdrant_client import QdrantClient, models
|
||||
|
||||
client = QdrantClient(
|
||||
url="",
|
||||
api_key="",
|
||||
cloud_inference=True
|
||||
)
|
||||
|
||||
COLLECTION_NAME=""
|
||||
EMBEDDING_MODEL=""
|
||||
# @hide-end
|
||||
|
||||
hits = client.query_points(
|
||||
collection_name=COLLECTION_NAME,
|
||||
query=models.Document(
|
||||
text="alien invasion",
|
||||
model=EMBEDDING_MODEL
|
||||
),
|
||||
query_filter=models.Filter(
|
||||
must=[models.FieldCondition(key="year", range=models.Range(gte=2000))]
|
||||
),
|
||||
limit=1,
|
||||
).points
|
||||
|
||||
for hit in hits:
|
||||
print(hit.payload, "score:", hit.score)
|
||||
+125
@@ -0,0 +1,125 @@
|
||||
use qdrant_client::qdrant::{
|
||||
Condition, CreateCollectionBuilder, CreateFieldIndexCollectionBuilder, Distance, Document,
|
||||
FieldType, Filter, PointStruct, Query, QueryPointsBuilder, Range, UpsertPointsBuilder, VectorParamsBuilder,
|
||||
};
|
||||
use qdrant_client::Qdrant;
|
||||
|
||||
pub async fn main() -> anyhow::Result<()> {
|
||||
// @hide-start
|
||||
let QDRANT_URL = "";
|
||||
let QDRANT_API_KEY = "";
|
||||
// @hide-end
|
||||
// @block-start client-connection
|
||||
let client = Qdrant::from_url(QDRANT_URL)
|
||||
.api_key(QDRANT_API_KEY)
|
||||
.build()?;
|
||||
// @block-end client-connection
|
||||
|
||||
// @block-start create-collection
|
||||
let collection_name = "my_books";
|
||||
|
||||
client
|
||||
.create_collection(
|
||||
CreateCollectionBuilder::new(collection_name)
|
||||
.vectors_config(VectorParamsBuilder::new(384, Distance::Cosine)), // Vector size is defined by used model
|
||||
)
|
||||
.await?;
|
||||
// @block-end create-collection
|
||||
|
||||
// @block-start upload-data
|
||||
let documents = [
|
||||
("The Time Machine", "A man travels through time and witnesses the evolution of humanity.", "H.G. Wells", 1895),
|
||||
("Ender's Game", "A young boy is trained to become a military leader in a war against an alien race.", "Orson Scott Card", 1985),
|
||||
("Brave New World", "A dystopian society where people are genetically engineered and conditioned to conform to a strict social hierarchy.", "Aldous Huxley", 1932),
|
||||
("The Hitchhiker's Guide to the Galaxy", "A comedic science fiction series following the misadventures of an unwitting human and his alien friend.", "Douglas Adams", 1979),
|
||||
("Dune", "A desert planet is the site of political intrigue and power struggles.", "Frank Herbert", 1965),
|
||||
("Foundation", "A mathematician develops a science to predict the future of humanity and works to save civilization from collapse.", "Isaac Asimov", 1951),
|
||||
("Snow Crash", "A futuristic world where the internet has evolved into a virtual reality metaverse.", "Neal Stephenson", 1992),
|
||||
("Neuromancer", "A hacker is hired to pull off a near-impossible hack and gets pulled into a web of intrigue.", "William Gibson", 1984),
|
||||
("The War of the Worlds", "A Martian invasion of Earth throws humanity into chaos.", "H.G. Wells", 1898),
|
||||
("The Hunger Games", "A dystopian society where teenagers are forced to fight to the death in a televised spectacle.", "Suzanne Collins", 2008),
|
||||
("The Andromeda Strain", "A deadly virus from outer space threatens to wipe out humanity.", "Michael Crichton", 1969),
|
||||
("The Left Hand of Darkness", "A human ambassador is sent to a planet where the inhabitants are genderless and can change gender at will.", "Ursula K. Le Guin", 1969),
|
||||
("The Three-Body Problem", "Humans encounter an alien civilization that lives in a dying system.", "Liu Cixin", 2008),
|
||||
];
|
||||
// @block-end upload-data
|
||||
|
||||
// @block-start upload-points
|
||||
let embedding_model = "sentence-transformers/all-minilm-l6-v2";
|
||||
|
||||
let points: Vec<PointStruct> = documents
|
||||
.iter()
|
||||
.enumerate()
|
||||
.map(|(idx, (name, description, author, year))| {
|
||||
PointStruct::new(
|
||||
idx as u64,
|
||||
Document::new(*description, embedding_model),
|
||||
[
|
||||
("name", (*name).into()),
|
||||
("description", (*description).into()),
|
||||
("author", (*author).into()),
|
||||
("year", (*year).into()),
|
||||
],
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
|
||||
client
|
||||
.upsert_points(UpsertPointsBuilder::new(collection_name, points))
|
||||
.await?;
|
||||
// @block-end upload-points
|
||||
|
||||
// @block-start query-engine
|
||||
let query_result = client
|
||||
.query(
|
||||
QueryPointsBuilder::new(collection_name)
|
||||
.query(Query::new_nearest(Document::new(
|
||||
"alien invasion",
|
||||
embedding_model,
|
||||
)))
|
||||
.limit(3)
|
||||
.with_payload(true),
|
||||
)
|
||||
.await?;
|
||||
|
||||
for hit in query_result.result {
|
||||
println!("{:?} score: {}", hit.payload, hit.score);
|
||||
}
|
||||
// @block-end query-engine
|
||||
|
||||
// @block-start create-payload-index
|
||||
client
|
||||
.create_field_index(
|
||||
CreateFieldIndexCollectionBuilder::new(collection_name, "year", FieldType::Integer)
|
||||
.wait(true),
|
||||
)
|
||||
.await?;
|
||||
// @block-end create-payload-index
|
||||
|
||||
// @block-start query-with-filter
|
||||
let query_result_filtered = client
|
||||
.query(
|
||||
QueryPointsBuilder::new(collection_name)
|
||||
.query(Query::new_nearest(Document::new(
|
||||
"alien invasion",
|
||||
embedding_model,
|
||||
)))
|
||||
.filter(Filter::must([Condition::range(
|
||||
"year",
|
||||
Range {
|
||||
gte: Some(2000.0),
|
||||
..Default::default()
|
||||
},
|
||||
)]))
|
||||
.limit(1)
|
||||
.with_payload(true),
|
||||
)
|
||||
.await?;
|
||||
|
||||
for hit in query_result_filtered.result {
|
||||
println!("{:?} score: {}", hit.payload, hit.score);
|
||||
}
|
||||
// @block-end query-with-filter
|
||||
|
||||
Ok(())
|
||||
}
|
||||
+101
@@ -0,0 +1,101 @@
|
||||
import { QdrantClient } from "@qdrant/js-client-rest";
|
||||
|
||||
// @hide-start
|
||||
const QDRANT_URL = "";
|
||||
const QDRANT_API_KEY = "";
|
||||
// @hide-end
|
||||
// @block-start client-connection
|
||||
const client = new QdrantClient({
|
||||
url: QDRANT_URL,
|
||||
apiKey: QDRANT_API_KEY,
|
||||
});
|
||||
// @block-end client-connection
|
||||
|
||||
// @block-start create-collection
|
||||
const collectionName = "my_books";
|
||||
|
||||
await client.createCollection(collectionName, {
|
||||
vectors: {
|
||||
size: 384, // Vector size is defined by used model
|
||||
distance: "Cosine",
|
||||
},
|
||||
});
|
||||
// @block-end create-collection
|
||||
|
||||
// @block-start upload-data
|
||||
const documents = [
|
||||
{ name: "The Time Machine", description: "A man travels through time and witnesses the evolution of humanity.", author: "H.G. Wells", year: 1895 },
|
||||
{ name: "Ender's Game", description: "A young boy is trained to become a military leader in a war against an alien race.", author: "Orson Scott Card", year: 1985 },
|
||||
{ name: "Brave New World", description: "A dystopian society where people are genetically engineered and conditioned to conform to a strict social hierarchy.", author: "Aldous Huxley", year: 1932 },
|
||||
{ name: "The Hitchhiker's Guide to the Galaxy", description: "A comedic science fiction series following the misadventures of an unwitting human and his alien friend.", author: "Douglas Adams", year: 1979 },
|
||||
{ name: "Dune", description: "A desert planet is the site of political intrigue and power struggles.", author: "Frank Herbert", year: 1965 },
|
||||
{ name: "Foundation", description: "A mathematician develops a science to predict the future of humanity and works to save civilization from collapse.", author: "Isaac Asimov", year: 1951 },
|
||||
{ name: "Snow Crash", description: "A futuristic world where the internet has evolved into a virtual reality metaverse.", author: "Neal Stephenson", year: 1992 },
|
||||
{ name: "Neuromancer", description: "A hacker is hired to pull off a near-impossible hack and gets pulled into a web of intrigue.", author: "William Gibson", year: 1984 },
|
||||
{ name: "The War of the Worlds", description: "A Martian invasion of Earth throws humanity into chaos.", author: "H.G. Wells", year: 1898 },
|
||||
{ name: "The Hunger Games", description: "A dystopian society where teenagers are forced to fight to the death in a televised spectacle.", author: "Suzanne Collins", year: 2008 },
|
||||
{ name: "The Andromeda Strain", description: "A deadly virus from outer space threatens to wipe out humanity.", author: "Michael Crichton", year: 1969 },
|
||||
{ name: "The Left Hand of Darkness", description: "A human ambassador is sent to a planet where the inhabitants are genderless and can change gender at will.", author: "Ursula K. Le Guin", year: 1969 },
|
||||
{ name: "The Three-Body Problem", description: "Humans encounter an alien civilization that lives in a dying system.", author: "Liu Cixin", year: 2008 },
|
||||
];
|
||||
// @block-end upload-data
|
||||
|
||||
// @block-start upload-points
|
||||
const embeddingModel = "sentence-transformers/all-minilm-l6-v2";
|
||||
|
||||
const points = documents.map((doc, idx) => ({
|
||||
id: idx,
|
||||
vector: {
|
||||
text: doc.description,
|
||||
model: embeddingModel,
|
||||
},
|
||||
payload: doc,
|
||||
}));
|
||||
|
||||
await client.upsert(collectionName, { points });
|
||||
// @block-end upload-points
|
||||
|
||||
// @block-start query-engine
|
||||
const queryResult = await client.query(collectionName, {
|
||||
query: {
|
||||
text: "alien invasion",
|
||||
model: embeddingModel,
|
||||
},
|
||||
limit: 3,
|
||||
});
|
||||
|
||||
for (const hit of queryResult.points) {
|
||||
console.log(hit.payload, "score:", hit.score);
|
||||
}
|
||||
// @block-end query-engine
|
||||
|
||||
// @block-start create-payload-index
|
||||
await client.createPayloadIndex(collectionName, {
|
||||
field_name: "year",
|
||||
field_schema: "integer",
|
||||
});
|
||||
// @block-end create-payload-index
|
||||
|
||||
// @block-start query-with-filter
|
||||
const queryResultFiltered = await client.query(collectionName, {
|
||||
query: {
|
||||
text: "alien invasion",
|
||||
model: embeddingModel,
|
||||
},
|
||||
filter: {
|
||||
must: [
|
||||
{
|
||||
key: "year",
|
||||
range: {
|
||||
gte: 2000,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
limit: 1,
|
||||
});
|
||||
|
||||
for (const hit of queryResultFiltered.points) {
|
||||
console.log(hit.payload, "score:", hit.score);
|
||||
}
|
||||
// @block-end query-with-filter
|
||||
-1
@@ -1 +0,0 @@
|
||||
This code snippet defines a dataset of science fiction books. Each book entry contains a name, description, author, and publication year. This dataset will be uploaded to the Qdrant collection for semantic search.
|
||||
-1
@@ -1 +0,0 @@
|
||||
This code snippet demonstrates how to upload points to a collection using inference at ingest time. Instead of providing explicit vectors, the example uses a `Document` object with the book description and a model name. Qdrant generates embeddings from the text using the specified model and stores the resulting vectors along with the book's metadata as payload.
|
||||
-37
@@ -1,37 +0,0 @@
|
||||
# @hide-start
|
||||
# mypy: disable-error-code="arg-type"
|
||||
from qdrant_client import QdrantClient, models
|
||||
|
||||
client = QdrantClient(
|
||||
url="",
|
||||
api_key="",
|
||||
cloud_inference=True
|
||||
)
|
||||
|
||||
COLLECTION_NAME=""
|
||||
documents = documents = [
|
||||
{
|
||||
"name": "",
|
||||
"description": "",
|
||||
"author": "",
|
||||
"year": 1895,
|
||||
}]
|
||||
# @hide-end
|
||||
|
||||
# Define the embedding model used by Cloud Inference
|
||||
EMBEDDING_MODEL="sentence-transformers/all-minilm-l6-v2"
|
||||
|
||||
client.upload_points(
|
||||
collection_name=COLLECTION_NAME,
|
||||
points=[
|
||||
models.PointStruct(
|
||||
id=idx,
|
||||
vector=models.Document(
|
||||
text=doc["description"],
|
||||
model=EMBEDDING_MODEL # Cloud Inference generates embeddings with this model
|
||||
),
|
||||
payload=doc
|
||||
)
|
||||
for idx, doc in enumerate(documents)
|
||||
],
|
||||
)
|
||||
Reference in New Issue
Block a user