Quick Start with Qdrant Cloud
Learn how to set up Qdrant Cloud and perform your first semantic search in just a few minutes. We’ll use a sample dataset of menu items pre-embedded with the BAAI/bge-small-en-v1.5 model.
1. Create a Cloud Cluster
- Register for a Cloud account with your email, Google or Github credentials.
- Go to Clusters and click Create First Cluster.
- Copy your API key when prompted - you’ll need it to connect. Store it somewhere safe as it won’t be displayed again.
For detailed cluster setup instructions, see the Cloud documentation.
2. Install the Qdrant Client
Once you have a cluster, the fastest way to get started is to use our official SDKs which provide a convenient interface for working with Qdrant in your preferred programming language.
pip install qdrant-client fastembed # for Python projects
# cargo add qdrant-client fastembed # for Rust projects
# npm install @qdrant/js-client-rest fastembed # for Node.js projects
3. Connect to Qdrant Cloud
Import the qdrant client and create a connection to your Qdrant Cloud cluster using your cluster URL and API key.
from qdrant_client import QdrantClient
# connect to Qdrant Cloud
client = QdrantClient(
url="https://xyz-example.eu-central.aws.cloud.qdrant.io",
api_key="your-api-key",
)
use qdrant_client::Qdrant;
// Connect to Qdrant Cloud
let client = Qdrant::from_url("https://xyz-example.eu-central.aws.cloud.qdrant.io:6334")
.api_key("your-api-key")
.build()?;
import { QdrantClient } from "@qdrant/js-client-rest";
const client = new QdrantClient({
url: "https://xyz-example.eu-central.aws.cloud.qdrant.io",
apiKey: "your-api-key",
});
# test the connection
curl -X GET \
'http://<your-qdrant-host>:6333/collections' \
--header 'api-key: <api-key-value>'
4. Create our collection
We will use some sample menu items to demonstrate how to create a collection and add data to it. Each menu item has a name, description, price, and category. First, we need to create a collection in Qdrant to store our menu items.
from qdrant_client.models import Distance, VectorParams
# create collection
client.create_collection(
collection_name="items",
vectors_config=VectorParams(size=384, distance=Distance.COSINE),
)
use qdrant_client::qdrant::{CreateCollectionBuilder, Distance, VectorParamsBuilder};
// create collection
client.create_collection(
CreateCollectionBuilder::new("items")
.vectors_config(VectorParamsBuilder::new(384, Distance::Cosine)),
)
.await?;
await client.createCollection("items", {
vectors: { size: 384, distance: "Cosine" },
});
curl -X PUT \
'http://<your-qdrant-host>:6333/collections/items' \
--header 'api-key: <api-key-value>' \
--header 'Content-Type: application/json' \
--data-raw '{
"vectors": {
"size": 384,
"distance": "Cosine"
}
}'
5. Populate the collection
Next, we will populate the collection with menu items. Each item will be represented as a point in the collection, with its vector embedding and associated metadata.
from qdrant_client.models import PointStruct
from fastembed import TextEmbedding
# load the embedding model
model = TextEmbedding('BAAI/bge-small-en-v1.5')
menu_items = [
("Pad Thai with Tofu", "Stir-fried rice noodles with tofu bean sprouts scallions and crushed peanuts in traditional tamarind sauce", "$13.95", "Noodles"),
("Grilled Salmon Fillet", "Wild-caught Atlantic salmon grilled with lemon butter and fresh herbs served with seasonal vegetables", "$24.50", "Seafood Entrees"),
("Mushroom Risotto", "Creamy arborio rice with mixed mushrooms parmesan truffle oil and fresh thyme", "$16.75", "Vegetarian"),
("Bibimbap Bowl", "Korean rice bowl with seasoned vegetables fried egg gochujang sauce and choice of protein", "$14.50", "Korean Bowls"),
("Falafel Wrap", "Crispy chickpea fritters with hummus tahini cucumber tomato and pickled vegetables in warm pita", "$11.25", "Mediterranean"),
("Shrimp Tacos", "Three soft tacos with grilled shrimp cabbage slaw chipotle aioli and fresh lime", "$13.00", "Tacos"),
("Vegetable Curry", "Mixed vegetables in aromatic coconut curry sauce with jasmine rice and naan bread", "$12.95", "Indian Curries"),
("Tuna Poke Bowl", "Fresh ahi tuna with avocado edamame cucumber seaweed salad over sushi rice with spicy mayo", "$16.50", "Poke Bowls"),
("Margherita Pizza", "Fresh mozzarella san marzano tomatoes basil and extra virgin olive oil on wood-fired crust", "$14.00", "Pizza"),
("Chicken Tikka Masala", "Tandoori chicken in creamy tomato sauce with aromatic spices served with basmati rice", "$15.95", "Indian Entrees"),
("Greek Salad", "Romaine lettuce tomatoes cucumbers kalamata olives feta cheese red onion with lemon oregano dressing", "$10.50", "Salads"),
("Lobster Roll", "Fresh Maine lobster meat with light mayo on toasted buttery roll served with chips", "$22.00", "Seafood Sandwiches"),
("Quinoa Buddha Bowl", "Organic quinoa with roasted chickpeas kale sweet potato tahini dressing and hemp seeds", "$13.50", "Healthy Bowls"),
("Beef Pho", "Traditional Vietnamese beef noodle soup with rice noodles fresh herbs bean sprouts and lime", "$12.75", "Noodle Soups"),
("Eggplant Parmesan", "Breaded eggplant layered with marinara mozzarella and parmesan served with pasta", "$15.25", "Italian Entrees"),
("Crab Cakes", "Maryland-style lump crab cakes with remoulade sauce and mixed greens", "$18.50", "Seafood Appetizers"),
("Tofu Stir Fry", "Crispy tofu with broccoli bell peppers snap peas in garlic ginger sauce over steamed rice", "$12.50", "Vegetarian Entrees"),
("Salmon Sushi Platter", "12 pieces of fresh salmon nigiri and sashimi with wasabi pickled ginger and soy sauce", "$19.95", "Sushi"),
("Caprese Sandwich", "Fresh mozzarella tomatoes basil pesto balsamic glaze on ciabatta bread", "$11.75", "Sandwiches"),
("Tom Yum Soup", "Spicy and sour Thai soup with shrimp lemongrass galangal mushrooms and kaffir lime leaves", "$11.50", "Soups"),
("Lentil Dal", "Red lentils simmered with turmeric cumin coriander served with rice and naan", "$11.95", "Vegan Entrees"),
("Fish and Chips", "Beer-battered cod with crispy fries malt vinegar and tartar sauce", "$16.00", "British Classics"),
("Veggie Burger", "House-made black bean and quinoa patty with avocado sprouts tomato on brioche bun", "$13.25", "Burgers"),
("Miso Ramen", "Rich miso broth with ramen noodles soft-boiled egg bamboo shoots nori and scallions", "$14.50", "Ramen"),
("Stuffed Bell Peppers", "Roasted bell peppers filled with rice vegetables herbs and melted cheese", "$13.75", "Vegetarian Entrees"),
("Scallop Risotto", "Pan-seared sea scallops over creamy parmesan risotto with white wine and lemon", "$26.50", "Seafood Specials"),
("Spring Rolls", "Fresh rice paper rolls with vegetables tofu rice noodles herbs and peanut dipping sauce", "$8.95", "Appetizers"),
("Oyster Po Boy", "Fried oysters with lettuce tomato pickles and remoulade on french bread", "$15.50", "Sandwiches"),
("Portobello Mushroom Steak", "Grilled portobello cap marinated in balsamic with roasted vegetables and quinoa", "$14.95", "Vegan Entrees"),
("Coconut Shrimp", "Jumbo shrimp breaded in shredded coconut served with sweet chili sauce", "$14.25", "Seafood Appetizers")
]
# embedding generator
points = []
embeddings = model.embed([f"{item[0]} {item[1]}" for item in menu_items])
for i, embedding in enumerate(embeddings):
vector = embedding.tolist()
point = PointStruct(
id=i,
vector=vector,
payload={
"item_name": menu_items[i][0],
"description": menu_items[i][1],
"price": menu_items[i][2],
"category": menu_items[i][3],
}
)
points.append(point)
# upsert points to collection
client.upsert(
collection_name="items",
points=points,
)
use fastembed::{EmbeddingModel, InitOptions, TextEmbedding};
use qdrant_client::qdrant::{PointStruct, UpsertPointsBuilder};
use qdrant_client::{Qdrant, Payload};
use serde_json::json;
// load the embedding model
let mut model = TextEmbedding::try_new(
InitOptions::new(EmbeddingModel::BGESmallENV15).with_show_download_progress(true),
)
.expect("Failed to load embedding model");
// generate embeddings and prepare points
let menu_items = vec![
(
"Pad Thai with Tofu",
"Stir-fried rice noodles with tofu bean sprouts scallions and crushed peanuts in traditional tamarind sauce",
"$13.95",
"Noodles",
),
(
"Grilled Salmon Fillet",
"Wild-caught Atlantic salmon grilled with lemon butter and fresh herbs served with seasonal vegetables",
"$24.50",
"Seafood Entrees",
),
(
"Mushroom Risotto",
"Creamy arborio rice with mixed mushrooms parmesan truffle oil and fresh thyme",
"$16.75",
"Vegetarian",
),
(
"Bibimbap Bowl",
"Korean rice bowl with seasoned vegetables fried egg gochujang sauce and choice of protein",
"$14.50",
"Korean Bowls",
),
(
"Falafel Wrap",
"Crispy chickpea fritters with hummus tahini cucumber tomato and pickled vegetables in warm pita",
"$11.25",
"Mediterranean",
),
(
"Shrimp Tacos",
"Three soft tacos with grilled shrimp cabbage slaw chipotle aioli and fresh lime",
"$13.00",
"Tacos",
),
(
"Vegetable Curry",
"Mixed vegetables in aromatic coconut curry sauce with jasmine rice and naan bread",
"$12.95",
"Indian Curries",
),
(
"Tuna Poke Bowl",
"Fresh ahi tuna with avocado edamame cucumber seaweed salad over sushi rice with spicy mayo",
"$16.50",
"Poke Bowls",
),
(
"Margherita Pizza",
"Fresh mozzarella san marzano tomatoes basil and extra virgin olive oil on wood-fired crust",
"$14.00",
"Pizza",
),
(
"Chicken Tikka Masala",
"Tandoori chicken in creamy tomato sauce with aromatic spices served with basmati rice",
"$15.95",
"Indian Entrees",
),
(
"Greek Salad",
"Romaine lettuce tomatoes cucumbers kalamata olives feta cheese red onion with lemon oregano dressing",
"$10.50",
"Salads",
),
(
"Lobster Roll",
"Fresh Maine lobster meat with light mayo on toasted buttery roll served with chips",
"$22.00",
"Seafood Sandwiches",
),
(
"Quinoa Buddha Bowl",
"Organic quinoa with roasted chickpeas kale sweet potato tahini dressing and hemp seeds",
"$13.50",
"Healthy Bowls",
),
(
"Beef Pho",
"Traditional Vietnamese beef noodle soup with rice noodles fresh herbs bean sprouts and lime",
"$12.75",
"Noodle Soups",
),
(
"Eggplant Parmesan",
"Breaded eggplant layered with marinara mozzarella and parmesan served with pasta",
"$15.25",
"Italian Entrees",
),
(
"Crab Cakes",
"Maryland-style lump crab cakes with remoulade sauce and mixed greens",
"$18.50",
"Seafood Appetizers",
),
(
"Tofu Stir Fry",
"Crispy tofu with broccoli bell peppers snap peas in garlic ginger sauce over steamed rice",
"$12.50",
"Vegetarian Entrees",
),
(
"Salmon Sushi Platter",
"12 pieces of fresh salmon nigiri and sashimi with wasabi pickled ginger and soy sauce",
"$19.95",
"Sushi",
),
(
"Caprese Sandwich",
"Fresh mozzarella tomatoes basil pesto balsamic glaze on ciabatta bread",
"$11.75",
"Sandwiches",
),
(
"Tom Yum Soup",
"Spicy and sour Thai soup with shrimp lemongrass galangal mushrooms and kaffir lime leaves",
"$11.50",
"Soups",
),
(
"Lentil Dal",
"Red lentils simmered with turmeric cumin coriander served with rice and naan",
"$11.95",
"Vegan Entrees",
),
(
"Fish and Chips",
"Beer-battered cod with crispy fries malt vinegar and tartar sauce",
"$16.00",
"British Classics",
),
(
"Veggie Burger",
"House-made black bean and quinoa patty with avocado sprouts tomato on brioche bun",
"$13.25",
"Burgers",
),
(
"Miso Ramen",
"Rich miso broth with ramen noodles soft-boiled egg bamboo shoots nori and scallions",
"$14.50",
"Ramen",
),
(
"Stuffed Bell Peppers",
"Roasted bell peppers filled with rice vegetables herbs and melted cheese",
"$13.75",
"Vegetarian Entrees",
),
(
"Scallop Risotto",
"Pan-seared sea scallops over creamy parmesan risotto with white wine and lemon",
"$26.50",
"Seafood Specials",
),
(
"Spring Rolls",
"Fresh rice paper rolls with vegetables tofu rice noodles herbs and peanut dipping sauce",
"$8.95",
"Appetizers",
),
(
"Oyster Po Boy",
"Fried oysters with lettuce tomato pickles and remoulade on french bread",
"$15.50",
"Sandwiches",
),
(
"Portobello Mushroom Steak",
"Grilled portobello cap marinated in balsamic with roasted vegetables and quinoa",
"$14.95",
"Vegan Entrees",
),
(
"Coconut Shrimp",
"Jumbo shrimp breaded in shredded coconut served with sweet chili sauce",
"$14.25",
"Seafood Appetizers",
),
];
let embeddings = model
.embed(
menu_items
.iter()
.map(|item| format!("{} {}", item.0, item.1))
.collect::<Vec<_>>(),
None,
)
.expect("Failed to generate embeddings");
let points = embeddings
.into_iter()
.enumerate()
.map(|(idx, embedding)| {
PointStruct::new(
idx as u64,
embedding,
Payload::try_from(json!({
"item_name": menu_items[idx].0,
"description": menu_items[idx].1,
"price": menu_items[idx].2,
"category": menu_items[idx].3,
}))
.unwrap(),
)
})
.collect::<Vec<_>>();
let _ = client
.upsert_points(UpsertPointsBuilder::new("items", points).wait(true))
.await;
import { TextEmbedding, EmbeddingModel } from 'fastembed';
// load the embedding model
const model = await FlagEmbedding.init({
model: EmbeddingModel.BGESmallENV15,
});
let menuItems = [
[
"Pad Thai with Tofu",
"Stir-fried rice noodles with tofu bean sprouts scallions and crushed peanuts in traditional tamarind sauce",
"$13.95",
"Noodles",
],
[
"Grilled Salmon Fillet",
"Wild-caught Atlantic salmon grilled with lemon butter and fresh herbs served with seasonal vegetables",
"$24.50",
"Seafood Entrees",
],
[
"Mushroom Risotto",
"Creamy arborio rice with mixed mushrooms parmesan truffle oil and fresh thyme",
"$16.75",
"Vegetarian",
],
[
"Bibimbap Bowl",
"Korean rice bowl with seasoned vegetables fried egg gochujang sauce and choice of protein",
"$14.50",
"Korean Bowls",
],
[
"Falafel Wrap",
"Crispy chickpea fritters with hummus tahini cucumber tomato and pickled vegetables in warm pita",
"$11.25",
"Mediterranean",
],
[
"Shrimp Tacos",
"Three soft tacos with grilled shrimp cabbage slaw chipotle aioli and fresh lime",
"$13.00",
"Tacos",
],
[
"Vegetable Curry",
"Mixed vegetables in aromatic coconut curry sauce with jasmine rice and naan bread",
"$12.95",
"Indian Curries",
],
[
"Tuna Poke Bowl",
"Fresh ahi tuna with avocado edamame cucumber seaweed salad over sushi rice with spicy mayo",
"$16.50",
"Poke Bowls",
],
[
"Margherita Pizza",
"Fresh mozzarella san marzano tomatoes basil and extra virgin olive oil on wood-fired crust",
"$14.00",
"Pizza",
],
[
"Chicken Tikka Masala",
"Tandoori chicken in creamy tomato sauce with aromatic spices served with basmati rice",
"$15.95",
"Indian Entrees",
],
[
"Greek Salad",
"Romaine lettuce tomatoes cucumbers kalamata olives feta cheese red onion with lemon oregano dressing",
"$10.50",
"Salads",
],
[
"Lobster Roll",
"Fresh Maine lobster meat with light mayo on toasted buttery roll served with chips",
"$22.00",
"Seafood Sandwiches",
],
[
"Quinoa Buddha Bowl",
"Organic quinoa with roasted chickpeas kale sweet potato tahini dressing and hemp seeds",
"$13.50",
"Healthy Bowls",
],
[
"Beef Pho",
"Traditional Vietnamese beef noodle soup with rice noodles fresh herbs bean sprouts and lime",
"$12.75",
"Noodle Soups",
],
[
"Eggplant Parmesan",
"Breaded eggplant layered with marinara mozzarella and parmesan served with pasta",
"$15.25",
"Italian Entrees",
],
[
"Crab Cakes",
"Maryland-style lump crab cakes with remoulade sauce and mixed greens",
"$18.50",
"Seafood Appetizers",
],
[
"Tofu Stir Fry",
"Crispy tofu with broccoli bell peppers snap peas in garlic ginger sauce over steamed rice",
"$12.50",
"Vegetarian Entrees",
],
[
"Salmon Sushi Platter",
"12 pieces of fresh salmon nigiri and sashimi with wasabi pickled ginger and soy sauce",
"$19.95",
"Sushi",
],
[
"Caprese Sandwich",
"Fresh mozzarella tomatoes basil pesto balsamic glaze on ciabatta bread",
"$11.75",
"Sandwiches",
],
[
"Tom Yum Soup",
"Spicy and sour Thai soup with shrimp lemongrass galangal mushrooms and kaffir lime leaves",
"$11.50",
"Soups",
],
[
"Lentil Dal",
"Red lentils simmered with turmeric cumin coriander served with rice and naan",
"$11.95",
"Vegan Entrees",
],
[
"Fish and Chips",
"Beer-battered cod with crispy fries malt vinegar and tartar sauce",
"$16.00",
"British Classics",
],
[
"Veggie Burger",
"House-made black bean and quinoa patty with avocado sprouts tomato on brioche bun",
"$13.25",
"Burgers",
],
[
"Miso Ramen",
"Rich miso broth with ramen noodles soft-boiled egg bamboo shoots nori and scallions",
"$14.50",
"Ramen",
],
[
"Stuffed Bell Peppers",
"Roasted bell peppers filled with rice vegetables herbs and melted cheese",
"$13.75",
"Vegetarian Entrees",
],
[
"Scallop Risotto",
"Pan-seared sea scallops over creamy parmesan risotto with white wine and lemon",
"$26.50",
"Seafood Specials",
],
[
"Spring Rolls",
"Fresh rice paper rolls with vegetables tofu rice noodles herbs and peanut dipping sauce",
"$8.95",
"Appetizers",
],
[
"Oyster Po Boy",
"Fried oysters with lettuce tomato pickles and remoulade on french bread",
"$15.50",
"Sandwiches",
],
[
"Portobello Mushroom Steak",
"Grilled portobello cap marinated in balsamic with roasted vegetables and quinoa",
"$14.95",
"Vegan Entrees",
],
[
"Coconut Shrimp",
"Jumbo shrimp breaded in shredded coconut served with sweet chili sauce",
"$14.25",
"Seafood Appetizers",
],
] as const;
// generate embeddings and prepare points
const points: any[] = [];
let idx = 0;
const embeddings = model.embed(menuItems.map(item => `${item[0]} ${item[1]}`));
for await (const embedding of embeddings) {
points.push({
id: idx,
vector: Array.from(embedding[0]),
payload: {
item_name: menuItems[idx][0],
description: menuItems[idx][1],
price: menuItems[idx][2],
category: menuItems[idx][3],
},
});
idx++;
}
// upsert points to collection
await client.upsert("items", { points });
6. Search the Menu Items
Now we can search the menu item dataset! We’ll use the same BAAI/bge-small-en-v1.5 model to embed our query text, then find the best dishes matching that embedding.
# generate query embedding
query_text = "vegetarian dishes"
query_vector = next(iter(model.embed(query_text)))
# search for similar menu items
results = client.query_points(
collection_name="items",
query=query_vector,
with_payload=True,
limit=5
)
# print results
for result in results.points:
print(f"Item: {result.payload.get('item_name', 'N/A')}")
print(f"Score: {result.score}")
print(f"Description: {result.payload['description'][:150]}...")
print(f"Price: {result.payload.get('price', 'N/A')}")
print("---")
// generate query embedding
let query_text = "vegetarian dishes";
let query_embeddings = model
.embed(vec![query_text], None)
.expect("Failed to generate embeddings");
let query_vector = query_embeddings[0].clone();
let results = client
.query(
QueryPointsBuilder::new("items")
.query(query_vector)
.with_payload(true)
.limit(5),
)
.await
.expect("Query failed");
let na_str = "N/A".to_string();
for result in results.result {
let payload = result.payload;
println!("Item: {}", payload.get("item_name")
.and_then(|v| v.as_str()).unwrap_or(&na_str));
println!("Score: {}", result.score);
println!("Description: {}", payload.get("description")
.and_then(|v| v.as_str()).unwrap_or(&na_str));
println!("Price: {}", payload.get("price")
.and_then(|v| v.as_str()).unwrap_or(&na_str));
println!("---");
}
// generate query embedding
const queryText = "vegetarian dishes";
const queryEmbedding = (await model.embed([queryText]).next()).value!
// search for similar items
const results = await client.query("items", {
query: Array.from(queryEmbedding[0]),
with_payload: true,
limit: 5,
});
// print results
for (const result of results.points) {
console.log(`Item: ${result.payload?.item_name || 'N/A'}`);
console.log(`Score: ${result.score}`);
console.log(`Description: ${result.payload?.description || 'N/A'}`);
console.log(`Price: ${result.payload?.price || 'N/A'}`);
console.log('---');
}
That’s Vector Search!
You’ve just performed semantic search on real menu item data. The query “vegetarian dishes” returned similar menu items based on meaning, not just keyword matching.
What’s Next?
- Explore filtering to combine semantic search with structured queries
- Learn about collections and advanced configuration options
- Check out more examples and tutorials
