WEAVIATE · TECH
Weaviate: open-source vector database with GraphQL and multi-modal modules
Weaviate is an Apache-2.0 vector DB in Go with GraphQL and REST APIs. May 2026 v1.30+, EU region Frankfurt, native hybrid search, multi-modal modules for text and image.
Researched & fact-checked by: DuneDive LLC · As of: 2026-05
What is Weaviate?
Weaviate is an open-source vector database under the Apache 2.0 license, written in Go. Launched in 2019 by SeMI Technologies (now Weaviate B.V.), it sits at version 1.30+ as of the May 2026 release. Weaviate solves the same task as Qdrant or Milvus – store high-dimensional embedding vectors and find nearest neighbours in milliseconds – but differs in three respects: GraphQL as primary query language, a module system for embeddings and rerankers inside the server, and native hybrid search (BM25 plus dense) without external components.
The module system is the most visible peculiarity. Instead of computing embeddings externally and passing only the vector, Weaviate can be configured with an embedding module (text2vec-openai, text2vec-cohere, text2vec-huggingface, multi2vec-clip). The server then accepts raw text or raw images and computes the embedding internally. For multi-modal use cases – fiduciary PDFs with embedded table scans or notarial files with signature images – that is a clear advantage over setups that must vectorise text and image separately.
The cloud variant (Weaviate Cloud Services) has been available in three tiers since 2024: Serverless Free, Standard from USD 280/month, and Enterprise. An EU region in Frankfurt is selectable. The self-hosted variant runs as a Docker container or Kubernetes Helm chart on your own hardware; persistent data lands in a mounted volume, backups go through the backup module into S3-compatible storage.
In the Swiss fiduciary context, Weaviate stands out as first choice when the team already works with GraphQL, must process multi-modal data, or needs native hybrid search without a separate BM25 engine.
Why it matters
Fiduciary offices rarely work with pure text. Client dossiers contain scanned receipts, handwritten notes, photographed quittances, and PDF attachments with tables. A RAG pipeline that mirrors this heterogeneity benefits from a database that can hold text and image in the same collection.
Three properties make Weaviate interesting for this profile. First: multi-modal modules. text2vec-cohere and multi2vec-clip enable text and image embeddings inside a single collection sharing a vector space. A query "show me receipts that match this invoice" can return both textual hits and visually similar scans without building two separate pipelines.
Second: native hybrid search. Since version 1.20, Weaviate can combine BM25 keyword score and dense vector score in a single query with a configurable alpha weight between 0 (keyword only) and 1 (vector only). For legal terms or fiduciary jargon – where exact matches on phrases such as "Art. 957a CO" matter – this delivers more stable results than pure dense search.
Third: an EU region in Frankfurt for the cloud variant. The data location is region-selectable; client data does not leave the EU economic area. For pure Swiss requirements under the revised data-protection act, Frankfurt is not within the national border but in an adequate third country – acceptable for most SME cases. Strict CH hosting requires moving to the self-hosted variant on Hetzner Helsinki, Falkenstein, or a Swiss provider such as Infomaniak.
How it works
Weaviate is a single binary reachable via HTTP/REST and GraphQL. The core unit is the class (equivalent to a Qdrant collection). A class defines: property schema (with type annotation), vector configuration (module or external vector), index parameters, and optional reranker modules.
Example: a class TreuhandDoc with properties title (text), client_id (int), date (date), confidentiality (text), and content (text). Vector configuration text2vec-cohere with model embed-multilingual-v3.0 – Weaviate computes the embedding from the content field automatically on import.
Import via REST: POST /v1/objects with class name, properties, and optionally a vector array. If no vector is supplied, Weaviate calls the configured embedding module. Batch import via /v1/batch/objects, typically 100 objects per batch.
Query via GraphQL: a Get query with nearText (semantic search), where (filter), and limit. Example: { Get { TreuhandDoc(nearText: {concepts: ["VAT Q1 statement"]}, where: {path: ["client_id"], operator: Equal, valueInt: 42}, limit: 10) { title content client_id } } }. Response: a list of objects with the requested fields.
Hybrid search via hybrid instead of nearText: { Get { TreuhandDoc(hybrid: {query: "Art. 957a CO retention", alpha: 0.5}, limit: 10) { title content } } }. Alpha controls the weight – 0 is pure BM25, 1 is pure vector, 0.5 is hybrid.
Multi-tenant separation runs through the tenancy feature since version 1.20. A class can be created with multiTenancyConfig: {enabled: true}; each request then carries a tenant header. Data between tenants is physically separated – important for fiduciary setups with strict client isolation.
Backup modules cover S3, GCS, and Azure Blob. A backup runs via POST /v1/backups/{backend} and saves one or more classes including schema and data. Restore via POST on the restore endpoint, also per class.
Weaviate to production in 5 steps
- 01Set up the Docker-Compose stack with the Weaviate image and a mounted volume; activate desired modules (text2vec-cohere, multi2vec-clip, backup-s3) in the ENV configuration.
- 02Plan the schema: one class per use case with property types; enable multi-tenancy if physical client separation is required.
- 03Configure embedding module keys and rerankers; with Cohere or OpenAI as external provider, run a TIA or prefer local modules.
- 04Build the ingestion pipeline: documents -> properties -> batch import. For multi-modal data, pass the image path additionally as a blob property.
- 05Connect the backup module to an S3 target and set up daily backup per class; wire monitoring to /v1/.well-known/ready and Prometheus metrics.
When to use Weaviate
Weaviate is the right choice when (a) multi-modal data – text plus image – must live in a single collection, (b) native hybrid search without a separate BM25 engine is needed, (c) GraphQL fits the stack as query language, or (d) embedding computation inside the database server rather than in application code is preferred.
Concrete cases: a RAG pipeline for fiduciary receipt recognition where scanned quittances must be searchable both via OCR text and via image embedding (multi2vec-clip). A semantic search over client dossiers with a hybrid score, weighting jargon such as "Art. 957a CO" exactly while still finding synonyms. A recommendation pipeline for similar client profiles with a reranker module.
The cloud variant in Frankfurt suits pilot projects without hardware investment; production typically moves to self-hosted once data volume or queries exceed the Standard tier (USD 280/month). Self-hosted on a Hetzner server in Falkenstein or Helsinki costs roughly CHF 30-80 per month for up to 10M vectors.
When not to use
If the team has no GraphQL experience and is only used to REST APIs, Qdrant is simpler. Weaviate has a REST API, but GraphQL is the idiomatic path – an extra learning curve. For pure text-RAG pipelines without multi-modal needs, Weaviate offers little advantage over the lighter Qdrant.
Also unsuitable for very small datasets under 50,000 entries – pgvector or Chroma suffice, are operationally simpler, and save a separate server. Weaviate clusters only pay off from about 5M vectors per node or with multi-region requirements.
For use cases with very high update pressure (e.g. a user profile that changes per request), Weaviate, like all HNSW-based vector DBs, is not ideal. Updates on existing vectors force index maintenance; at several thousand updates per minute, this can cost performance.
The cloud variant has a non-linear cost curve. Anyone starting on the Standard tier who scales to 50M vectors or multi-region replication lands in four-digit USD figures per month quickly. Before committing to the cloud variant, the cost curve for 12-24 months should be projected.
Trade-offs
STRENGTHS
- Native hybrid search (BM25 plus dense) in one query, no external tools
- Multi-modal modules for text and image in the same collection
- In-server embedding module offloads vectorisation from the application
- Cloud variant with EU region Frankfurt, self-hosted Apache 2.0
WEAKNESSES
- GraphQL as primary query language forces a learning curve in REST-oriented teams
- Cloud pricing scales non-linearly; four-digit figures possible past Standard tier
- External embedding providers (OpenAI, Cohere) trigger a third-country transfer
- More modules means more configuration surface than Qdrant
FAQ
What does Weaviate Cloud actually cost?
As of May 2026, Weaviate Cloud Serverless starts with a free tier (14-day sandbox); Flex tier from USD 25/month, Standard from USD 280/month. Enterprise with a dedicated cluster on request. For a five-person fiduciary with 500,000 vectors and 200 queries/day, the Standard tier is sufficient. Self-hosted on Hetzner costs roughly CHF 30-80/month for the same load.
How does Weaviate differ from Qdrant?
Both are Apache-2.0 and HNSW-based. Weaviate has GraphQL, a module system for in-server embeddings, and native hybrid search. Qdrant is in Rust, lighter to operate, with pure REST/gRPC API. Anyone needing multi-modal or GraphQL goes to Weaviate. Anyone wanting raw vector search with minimal overhead stays on Qdrant. Both self-host in the EU.
Which embedding models can Weaviate call internally?
As of May 2026: OpenAI (text-embedding-3-small/large), Cohere (embed-multilingual-v3.0), HuggingFace Inference, Voyage, Mistral AI, Google PaLM, Azure OpenAI, AWS Bedrock, and local models via text2vec-transformers (BGE, E5, GTE). Multi-modal: multi2vec-clip, multi2vec-bind, ref2vec-centroid. External providers require a third-country transfer review.
Can I migrate to Weaviate from Qdrant?
Yes. Export from Qdrant via the Scroll API yields vectors plus payload. A script transforms payload fields into Weaviate properties and writes them via /v1/batch/objects. Important: the embedding model must stay the same or all vectors must be recomputed. Typical effort for 1M vectors: half a day including spot checks.
Related topics
Sources
- Weaviate documentation – concepts, modules, GraphQL API · 2026-05
- Weaviate Cloud pricing – Serverless, Flex, Standard, Enterprise · 2026-05
- Weaviate GitHub releases and changelog v1.30+ · 2026-05
- Weaviate blog – Hybrid search with BM25 and dense vectors · 2026-04
- ANN-Benchmarks – open methodology for nearest-neighbour search · 2026-03