Semantic search and RAG
Index embeddings and query similarity for search experiences, copilots, and contextual retrieval flows with HTTP or gRPC integration.
Go • HTTP + gRPC • Vector DB
LumenVec gives you a direct path to index embeddings, query similarity, and operate locally with snapshot+WAL or disk-backed payloads, configurable cache, Prometheus metrics, and security controls for authenticated deployments.
Ideal for batch pipelines, semantic search, and internal services that need a lightweight, predictable vector layer that integrates over HTTP or gRPC.
docker build -t lumenvec:latest .
docker run --rm -p 19190:19190 -p 19191:19191 \
-v "$(pwd)/data:/data" lumenvec:latest
curl -s http://localhost:19190/health
curl -s -X POST http://localhost:19190/vectors/search \
-H "Content-Type: application/json" \
-d '{"values":[1,2,3.1],"k":2}'
Proof of value
The goal here is to cover the essentials of ingest and vector search with HTTP or gRPC transports, predictable operations, and less friction for self-hosted environments.
Index embeddings and query similarity for search experiences, copilots, and contextual retrieval flows with HTTP or gRPC integration.
Load batches, reprocess collections, and run recurring ingest jobs with batch operations, local durability, and exact/ANN modes.
Use it in internal tools and private services with metrics, API key auth, TLS, IP rate limiting, and trusted proxy controls.
Everything you need to store and query embeddings with a focus on batch workflows, explicit transport selection, and simple ops.
Endpoints and methods for upsert/get/delete/search and batch operations, with explicit transport selection per process.
Pick exact or approximate search via search.mode and configurable ANN profiles.
Use snapshot + WAL or disk-backed payloads, with startup rebuild based on the selected backend.
Prometheus at /metrics, API key auth on HTTP and gRPC, TLS, IP rate limiting, and trusted proxies.
Dimension, payload, top-k, and in-memory cache with TTL plus byte/item limits.
Go client and examples for HTTP and gRPC flows in the repository.
server:
protocol: http
port: 19190
rate_limit_rps: 100
grpc:
port: 19191
security:
profile: production
auth:
enabled: true
grpc_enabled: true
transport:
tls_enabled: true
Source: configs/config.yaml and configs/config.grpc.yaml.
go mod tidy
go run ./cmd/server
HTTP at http://localhost:19190; gRPC at localhost:19191 when server.protocol=grpc.
docker compose up --build
Publishes 19190, exposes 19191 for gRPC, includes Prometheus/Grafana, and persists to ./data.
# criar/upsert
curl -X POST http://localhost:19190/vectors \
-H "Content-Type: application/json" \
-d '{"id":"doc-1","values":[1,2,3]}'
# obter
curl http://localhost:19190/vectors/doc-1
# deletar
curl -X DELETE http://localhost:19190/vectors/doc-1
curl -X POST http://localhost:19190/vectors/search \
-H "Content-Type: application/json" \
-d '{"values":[1,2,3.1],"k":2}'
# batch search
curl -X POST http://localhost:19190/vectors/search/batch \
-H "Content-Type: application/json" \
-d '{"queries":[{"id":"q1","values":[1,2,3],"k":2}]}'
c := client.NewVectorClient("http://localhost:19190")
items := map[string][]float64{
"doc-1": {1, 2, 3},
"doc-2": {1.1, 2.1, 2.9},
"doc-3": {9, 8.5, 7.5},
}
for id, vec := range items {
if err := c.AddVectorWithID(id, vec); err != nil { return err }
}
hits, err := c.SearchVector([]float64{1, 2, 3.1}, 2)
if err != nil { return err }
for _, h := range hits {
fmt.Printf("%s %.4f\n", h.ID, h.Distance)
}
Source: examples/ingest_example.go.
Workflow with coverage enforcement, race validation, and tests for HTTP, gRPC, cache, and persistence flows.
View CHANGELOG