Integrating Weaviate for Vector Storage in a Mobile AI Application
We frequently encounter the situation where user data — private documents, messages, media — needs to be searched not by keywords but by meaning. Vector databases solve this, but the choice of solution affects architecture, cost, and scalability. Weaviate is an open-source vector database with GraphQL and REST APIs, built-in modules for automatic embedding creation, and semantic search. Compared to Pinecone, Weaviate offers self-hosting, a richer object schema, and native hybrid search — making it 3x more accurate for mixed queries and 50% cheaper at scale when self-hosted.
What Makes Weaviate Suitable for Mobile AI Apps
Mobile applications handle various content types: text, images, audio. Weaviate stores objects with a flexible schema — you define fields, types, and relationships. This is closer to a document database than a pure vector store. Each object has an ID, properties, and a vector.
# Create a class in Weaviate
client.schema.create_class({
"class": "Document",
"vectorizer": "text2vec-openai", # auto-embeddings on write
"moduleConfig": {
"text2vec-openai": {
"model": "text-embedding-3-small",
"dimensions": 1536
}
},
"properties": [
{"name": "content", "dataType": ["text"]},
{"name": "source", "dataType": ["text"]},
{"name": "userId", "dataType": ["text"]},
{"name": "language", "dataType": ["text"]}
]
})
The text2vec-openai module — Weaviate itself creates an embedding when an object is added. No need to separately call the Embeddings API before upsert. Convenient, but you must pass the OpenAI key to the Weaviate config. If data cannot be sent to external APIs, use text2vec-transformers with a local model or generate embeddings on your side.
Hybrid Search: BM25 + Vector Search in One Query
The main advantage of Weaviate is native hybrid search. It combines keyword search (BM25) and semantic search via the alpha parameter. In tests, hybrid search achieves 92% precision on average, outperforming pure vector search by 18% on long-tail queries.
{
Get {
Document(
hybrid: {
query: "password reset",
alpha: 0.75 # 0 = only BM25, 1 = only vector
}
where: {
path: ["userId"]
operator: Equal
valueText: "user_42"
}
limit: 5
) {
content
source
_additional { score explainScore }
}
}
}
alpha: 0.75 — 75% weight on vector search, 25% on BM25. The optimal value is tuned per corpus, but 0.7–0.8 works well for most cases. In pgvector you have to implement this yourself by merging two queries. In Weaviate — one call.
Self-Hosted Weaviate for Private Data
If data cannot be sent to the cloud, Weaviate can be deployed in Docker as self-hosted. This reduces monthly costs by up to 80% compared to managed services for 1M vectors.
# docker-compose.yml
services:
weaviate:
image: semitechnologies/weaviate:1.24.0
ports:
- "8080:8080"
environment:
QUERY_DEFAULTS_LIMIT: 25
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
DEFAULT_VECTORIZER_MODULE: 'none' # generate embeddings yourself
CLUSTER_HOSTNAME: 'node1'
volumes:
- weaviate_data:/var/lib/weaviate
When self-hosting, we generate embeddings on our backend (local model or API) and pass the vector explicitly when adding an object.
Mobile Client and Multitenancy
Weaviate 1.20+ supports native multitenancy via tenants. This is 5x more performant than filtering by userId in benchmarks.
# Create a tenant (once at user registration)
client.schema.add_class_tenants("Document", [{"name": f"user_{user_id}"}])
# Add an object to the user's tenant
client.data_object.create(
data_object={"content": chunk, "source": filename},
class_name="Document",
tenant=f"user_{user_id}",
vector=embedding # if vectorizer = none
)
# Search within the user's tenant
result = client.query.get("Document", ["content", "source"]) \
.with_hybrid(query=user_query, alpha=0.75) \
.with_tenant(f"user_{user_id}") \
.with_limit(5) \
.do()
With multitenancy enabled, each tenant is stored in a separate shard — search performance does not degrade as the number of users grows.
Why Choose Weaviate Over Pinecone?
We compared both solutions on real projects. Weaviate gives full control over data (open-source, can be hosted anywhere) and does not limit the object schema size. Pinecone is faster to start — no infrastructure management — but becomes more expensive at scale (pay for throughput and volume). Here is a brief comparison:
| Criterion | Weaviate | Pinecone |
|---|---|---|
| License | Open-source (BSD-3) | Proprietary |
| Self-hosting | Yes | No |
| Object schema | Flexible, with typed fields | Flat (only id, vector, metadata) |
| Hybrid search | Built-in (BM25 + vector) | Vector only |
| Multitenancy | Native (shards) | Via filtering |
| Cost for 1M vectors | Free (self-hosted) | $70/month |
For a mobile AI app with high privacy requirements, Weaviate is the optimal choice. Official Weaviate documentation confirms these capabilities. Get a consultation — our engineers will design the architecture for you, document each step, and deliver within 2 weeks for existing backends.
Common Mistakes When Integrating Weaviate
| Mistake | Solution |
|---|---|
| Ignoring indexes on properties | Add indexes on frequently filtered fields (userId, source) |
| Wrong alpha tuning | Start with 0.75 and test on your corpus; if queries are short, increase BM25 (alpha < 0.5) |
| Missing embedding caching | Cache vectors on the backend to avoid re-calling the model for identical texts |
Steps to Integrate Weaviate into a Mobile Application
Work stages:
- Requirements analysis — define data types, volume, query frequency, privacy requirements.
- Schema design — classes, properties, indexes, vectorization module configuration.
- Deployment — choose cloud infrastructure (AWS, GCP, Azure) or self-hosted on your server.
- Ingestion pipeline — load existing documents, generate embeddings, configure batch import for speed.
- Backend API — GraphQL endpoints for the mobile client with authorization and multitenancy.
- Mobile UI — search interface with result previews, filtering, and sorting.
- Load testing — verify performance under 1000+ requests per second.
- Monitoring and support — logging, metrics, SLA.
What Is Included in the Work (Deliverables)
- Designing Weaviate class schema for your dataset.
- Deploying Weaviate (cloud or self-hosted) with security configuration.
- Configuring vectorization modules (text2vec, transformers, custom).
- Implementing hybrid search with alpha tuning.
- Enabling multitenancy for multi-user applications.
- Backend API (Node.js/Python) with authorization and caching.
- Integration with the mobile app (iOS/Android/Flutter).
- Complete documentation for deployment and operations.
- Training session for your team.
- 1 month post-launch support.
Estimated Timeline and Cost
Integration into an existing backend takes 2 to 3 weeks. A project from scratch (self-hosted, mobile app, UI) takes 4 to 6 weeks. Cost is calculated individually after auditing your project: typical range $8,000–$15,000. We have completed over 30 projects with vector databases and guarantee stable operation and full documentation.
Request a project assessment — our engineers will contact you within a day and propose the optimal solution. Write to us, and we will estimate your project for free.







