Providers
Embex supports a wide range of vector databases. Switching providers is as simple as changing the provider and URL parameters.
The Recommended Path
Section titled “The Recommended Path”| Stage | Provider | Why? |
|---|---|---|
| Development | LanceDB | Zero Setup. Runs locally (embedded). No Docker or API keys needed. |
| Production | Qdrant / Pinecone / Milvus | Scale. Managed services, high throughput, distributed. |
LanceDB (Recommended for Dev)
Section titled “LanceDB (Recommended for Dev)”Start here. LanceDB runs in-process and stores data in the local filesystem.
# Persist to local folder (creates ./data directory)client = await EmbexClient.new_async(provider="lancedb", url="./data")// Persist to local folder (creates ./data directory)const client = await EmbexClient.newAsync("lancedb", "./data");Cloud Providers (Production)
Section titled “Cloud Providers (Production)”When you’re ready to scale, switch to a cloud provider.
Pinecone
Section titled “Pinecone”Managed serverless vector database.
client = await EmbexClient.new_async( provider="pinecone", url="https://index-name.svc.pinecone.io", api_key="your-api-key")const client = await EmbexClient.newAsync( "pinecone", "https://index-name.svc.pinecone.io", "your-api-key");Qdrant
Section titled “Qdrant”High-performance Rust vector database (Cloud or Self-Hosted).
# Qdrant Cloudclient = await EmbexClient.new_async( provider="qdrant", url="https://xyz-example.eu-central.aws.cloud.qdrant.io:6333", api_key="your-api-key")
# Local Dockerclient = await EmbexClient.new_async( provider="qdrant", url="http://localhost:6333")// Qdrant Cloudconst client = await EmbexClient.newAsync( "qdrant", "https://xyz-example.eu-central.aws.cloud.qdrant.io:6333", "your-api-key");
// Local Dockerconst client = await EmbexClient.newAsync("qdrant", "http://localhost:6333");Other Providers
Section titled “Other Providers”Elasticsearch
Section titled “Elasticsearch”The Elasticsearch adapter is available in the source tree for the next release. Use the elasticsearch provider with the cluster’s HTTP(S) endpoint. Pass the encoded Elasticsearch API key through api_key in Python or as the third argument to newAsync in Node.js. Omit it for a local cluster with security disabled.
import os
client = await EmbexClient.new_async( provider="elasticsearch", url=os.environ["ELASTICSEARCH_URL"], api_key=os.environ.get("ELASTICSEARCH_API_KEY"),)const client = await EmbexClient.newAsync( "elasticsearch", process.env.ELASTICSEARCH_URL ?? "http://localhost:9200", process.env.ELASTICSEARCH_API_KEY,);Create collections through Embex so the index has the vector and metadata mappings. Collection names use lowercase ASCII letters, digits, hyphens, underscores and periods, starting with a letter or digit. Elasticsearch 8.19 and 9.x provide the kNN and point-in-time APIs used by the adapter. The adapter uses Elasticsearch relevance scores, exact string filters, and numeric range filters. Give each metadata key a consistent type across points. Numeric metadata is indexed as double precision for filtering. Bulk writes wait for a refresh, which requires the maintenance or manage index privilege on secured clusters. A migration cursor stays valid for one minute between pages.
Run the optional lifecycle integration test against a dedicated Elasticsearch instance with ELASTICSEARCH_URL and, when needed, ELASTICSEARCH_API_KEY set.
cargo test -p bridge-embex-elasticsearch --test elasticsearch real_elasticsearch_lifecycle -- --ignoredMilvus
Section titled “Milvus”client = await EmbexClient.new_async(provider="milvus", url="http://localhost:19530")const client = await EmbexClient.newAsync("milvus", "http://localhost:19530");Weaviate
Section titled “Weaviate”client = await EmbexClient.new_async(provider="weaviate", url="http://localhost:8080")const client = await EmbexClient.newAsync("weaviate", "http://localhost:8080");Chroma
Section titled “Chroma”client = await EmbexClient.new_async(provider="chroma", url="http://localhost:8000")const client = await EmbexClient.newAsync("chroma", "http://localhost:8000");PgVector
Section titled “PgVector”client = await EmbexClient.new_async( provider="pgvector", url="postgresql://user:pass@localhost:5432/db")const client = await EmbexClient.newAsync( "pgvector", "postgresql://user:pass@localhost:5432/db");Supported Providers
Section titled “Supported Providers”| Provider | Provider String | Example URL |
|---|---|---|
| Pinecone | "pinecone" | "https://index-name.svc.pinecone.io" |
| Qdrant | "qdrant" | "http://localhost:6333" |
| Milvus | "milvus" | "http://localhost:19530" |
| Weaviate | "weaviate" | "http://localhost:8080" |
| Chroma | "chroma" | "http://localhost:8000" |
| PgVector | "pgvector" | "postgresql://user:pass@localhost:5432/db" |
| LanceDB | "lancedb" | "./data" |
| Elasticsearch | "elasticsearch" | "http://localhost:9200" |
The opensearch and redis adapters are experimental placeholders. Their vector operations currently return NotImplemented.