Quickstart

Overview

LocalVectorDB is a document-first vector database that combines the simplicity of SQLite with the power of FAISS for vector similarity search. Its architecture is focused on documents rather than chunks, making it easier to work with while providing more powerful features.

Key Features:

  • Document-First API: Work with documents, not chunks - chunking is handled automatically

  • Unified Search Interface: Vector, keyword, and hybrid search with normalized scoring

  • Position-Tracking Chunking: Perfect document reconstruction with precise highlighting

  • Structured Metadata: SQLite-backed metadata with indexed columns and schema validation

  • Plugin-Based Embeddings: Support for Ollama, OpenAI, and custom embedding providers

  • Full-Text Search: Built-in FTS5 support for keyword search

  • Remote Client: HTTP API client for distributed deployments

  • Production Ready: Comprehensive CLI, configuration management, and server deployment

Quick Installation

# Basic installation (uv recommended; pip works too)
uv add localvectordb
# pip install localvectordb

# With server dependencies
uv add "localvectordb[server]"
# pip install "localvectordb[server]"

# Development environment (dev tooling + test extras), via uv
uv sync --dev

# The whole kit and kaboodle:
uv add "localvectordb[all]"
# pip install "localvectordb[all]"

5-Minute Example

Note

This example uses the default embedding provider, Ollama, which must be running locally with the model pulled (ollama pull nomic-embed-text). To use a different backend, pass embedding_provider= (e.g. "openai", "sentence_transformers") with the matching embedding_model. See Embeddings for all providers.

from localvectordb import VectorDB
from localvectordb.core import MetadataField, MetadataFieldType

# Create a document database with metadata schema
db = VectorDB(
    name="my_documents",
    base_path="./my_vectordb",
    metadata_schema={
        'title': MetadataField(type=MetadataFieldType.TEXT, indexed=True,
                             embedding_enabled=True),  # Enable embeddings for title
        'author': MetadataField(type=MetadataFieldType.TEXT, indexed=True),
        'abstract': MetadataField(type=MetadataFieldType.TEXT,
                                embedding_enabled=True),  # Enable embeddings for abstract
        'date': MetadataField(type=MetadataFieldType.DATE, indexed=True),
        'tags': MetadataField(type=MetadataFieldType.JSON)
    },
    embedding_model="nomic-embed-text",
    chunk_size=500
)

# You can also define schema with shorthand:
#   metadata_schema = {
#       "title": ("text", True),   # type, indexed
#       "author": ("text", True, True),  # type, indexed, required
#       # ... etc.
#   }

# Add documents with metadata
documents = [
    "LocalVectorDB is a document-first vector database...",
    "Python is a powerful programming language...",
    "Machine learning enables computers to learn..."
]

metadata = [
    {"title": "LocalVectorDB Guide", "author": "AI Assistant", "date": "2024-01-01"},
    {"title": "Python Basics", "author": "Developer", "date": "2024-01-02"},
    {"title": "ML Introduction", "author": "Data Scientist", "date": "2024-01-03"}
]

# Insert documents
doc_ids = db.upsert(documents, metadata=metadata)
print(f"Added documents: {doc_ids}")

# Search documents
results = db.query("vector database", search_type="vector", k=3)
for result in results:
    print(f"Score: {result.score:.3f} | {result.content[:100]}...")

# Hybrid search combining vector and keyword search
results = db.query("python programming", search_type="hybrid", k=2)

# Multi-column search - searches document content AND metadata fields
# This searches across content, title, and abstract simultaneously
multi_results = db.query_multi_column("machine learning", k=5)
for result in multi_results:
    column = result.metadata.get('_search_column', 'unknown')
    print(f"Found in {column}: Score {result.score:.3f}")

# Search specific columns only
title_results = db.query_multi_column(
    "database",
    columns=['title', 'abstract'],  # Only search these fields
    k=3
)

# Filter by metadata
python_docs = db.filter(where={"author": "Developer"})

# Close database
db.close()

Server Example

# Start LocalVectorDB server
lvdb serve --host 127.0.0.1 --port 8000

# Create database via CLI
lvdb create my_database --embedding-model nomic-embed-text

# Add documents
lvdb db my_database add document.txt

# Search documents
lvdb db my_database search "query text" --limit 5

Remote Database Example

You can connect to the LocalVectorDB server using the VectorDB class, which allows for connecting to local or remote databases.

from localvectordb import VectorDB

# Connect to remote LocalVectorDB server
db = VectorDB(
    name="my_remote_db",
    base_path="http://localhost:8000",
    # Include api_key if you configured the server with api keys.
    # api_key="your_api_key"
)

# Same API as local database!
doc_ids = db.upsert(["Remote document content"])
results = db.query("search query")