upstash-haystack
Upstash Vector integration for Haystack — serverless, scalable vector search with zero infrastructure.
Overview
upstash-haystack brings Upstash Vector into the Haystack ecosystem. Upstash Vector is a serverless, pay-as-you-go vector database with a generous free tier — no servers to provision, no clusters to manage.
Components
| Component | Description |
|---|---|
UpstashDocumentStore |
Full-featured document store backed by Upstash Vector |
UpstashEmbeddingRetriever |
Dense retrieval using cosine/dot-product similarity |
UpstashHybridRetriever |
Dense + sparse hybrid search via native Reciprocal Rank Fusion (RRF) |
Installation
pip install upstash-haystack
Quick Start
1. Create an Upstash Vector index
Sign up at console.upstash.com and create a Vector index. Copy the REST URL and REST Token from the dashboard.
export UPSTASH_VECTOR_REST_URL="https://your-endpoint.upstash.io"
export UPSTASH_VECTOR_REST_TOKEN="your-token"
2. Dense (Embedding) Retrieval
from haystack import Document, Pipeline
from haystack_integrations.document_stores.upstash import UpstashDocumentStore
from haystack_integrations.components.retrievers.upstash import UpstashEmbeddingRetriever
# Initialize the document store (reads credentials from env vars)
document_store = UpstashDocumentStore()
# Write documents with embeddings
docs = [
Document(content="The capital of France is Paris.", embedding=[0.1, 0.2, ...]),
Document(content="The capital of Germany is Berlin.", embedding=[0.4, 0.5, ...]),
]
document_store.write_documents(docs)
# Retrieve the top-k most similar documents
retriever = UpstashEmbeddingRetriever(document_store=document_store)
result = retriever.run(query_embedding=[0.1, 0.2, ...], top_k=1)
print(result["documents"])
3. Hybrid Retrieval (Dense + Sparse)
Upstash Vector natively supports hybrid search via Reciprocal Rank Fusion (RRF), combining dense and sparse signals for superior relevance.
from haystack.dataclasses import SparseEmbedding
from haystack_integrations.components.retrievers.upstash import UpstashHybridRetriever
retriever = UpstashHybridRetriever(document_store=document_store)
result = retriever.run(
query_embedding=[0.1, 0.2, ...],
query_sparse_embedding=SparseEmbedding(indices=[0, 5, 12], values=[0.9, 0.4, 0.2]),
top_k=5,
)
print(result["documents"])
4. Filtering
# Equality filter
docs = document_store.filter_documents(filters={"field": "meta.category", "operator": "==", "value": "science"})
# AND operator
docs = document_store.filter_documents(
filters={
"operator": "AND",
"conditions": [
{"field": "meta.category", "operator": "==", "value": "science"},
{"field": "meta.year", "operator": ">", "value": 2020},
],
}
)
Configuration
The document store is configured via environment variables or explicit Secret objects:
from haystack.utils.auth import Secret
from haystack_integrations.document_stores.upstash import UpstashDocumentStore
store = UpstashDocumentStore(
url=Secret.from_env_var("UPSTASH_VECTOR_REST_URL"),
token=Secret.from_env_var("UPSTASH_VECTOR_REST_TOKEN"),
)
Development
This project uses Hatch for environment and dependency management.
# Format and lint
hatch run fmt
# Type checking
hatch run test:types
# Unit tests (mocked, no credentials needed)
hatch run test:unit
# Integration tests (requires live Upstash credentials)
export UPSTASH_VECTOR_REST_URL="..."
export UPSTASH_VECTOR_REST_TOKEN="..."
hatch run test:integration
License
upstash-haystack is distributed under the terms of the Apache 2.0 license.
Metadata
Release files for upstash-haystack 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| upstash_haystack-0.1.1.tar.gz | 17.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| upstash_haystack-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 32.2 kB
Release files / upstash_haystack-0.1.1.tar.gz
| Download URL | upstash_haystack-0.1.1.tar.gz |
|---|---|
| Size | 17.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6ecc941c064af5993618d62890a9de2dc46fb9806ed4384fc40ae4339a6e3a11
|
|
BLAKE2b-256 checksum How to use checksums |
8df1c31dda35850c42900512065eea94e5b7b71fca19799fa9a0d944a683b7d4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
Hatch/1.17.1 {"ci":true,"cpu":"x86_64","distro":{"id":"noble","libc":{"lib":"glibc","version":"2.39"},"name":"Ubuntu","version":"24.04"},"implementation":{"name":"CPython","version":"3.10.20"},"installer":{"name":"hatch","version":"1.17.1"},"openssl_version":"OpenSSL 3.0.13 30 Jan 2024","python":"3.10.20","system":{"name":"Linux","release":"6.17.0-1020-azure"}} HTTPX2/2.9.1
|
Release files / upstash_haystack-0.1.1-py3-none-any.whl
| Download URL | upstash_haystack-0.1.1-py3-none-any.whl |
|---|---|
| Size | 14.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a589322e657dac8a988e5b583075b2551b527bd97e5943b21bc485800b0f5bb2
|
|
BLAKE2b-256 checksum How to use checksums |
6cf92c7e55a7723862af9deb73e5536f92a2a2890887cda0ff58b92c992ba373
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
Hatch/1.17.1 {"ci":true,"cpu":"x86_64","distro":{"id":"noble","libc":{"lib":"glibc","version":"2.39"},"name":"Ubuntu","version":"24.04"},"implementation":{"name":"CPython","version":"3.10.20"},"installer":{"name":"hatch","version":"1.17.1"},"openssl_version":"OpenSSL 3.0.13 30 Jan 2024","python":"3.10.20","system":{"name":"Linux","release":"6.17.0-1020-azure"}} HTTPX2/2.9.1
|