Augment existing database tables with vector and BM25 search
Project description
dot-search
dot-search augments existing database tables with vector search, BM25 keyword search, and exact substring matching. Results from multiple strategies are fused via Reciprocal Rank Fusion (RRF).
Prerequisites
PostgreSQL (production)
Requires pgvector and ParadeDB pg_search:
CREATE EXTENSION vector;
CREATE EXTENSION pg_search;
SQLite (testing only)
Uses sqlite-vec. No BM25 support.
Install
pip install dot-search
Environment variables
| Variable | Example |
|---|---|
DOT__EMBED_API_KEY |
Bearer token |
DOT__EMBED_BASE_URL |
https://api.openai.com/v1 |
DOT__EMBED_MODEL |
text-embedding-3-small |
DOT__EMBED_DIMENSION |
1536 |
Works with any OpenAI-compatible API (OpenAI, vLLM, TGI, Ollama, etc.).
Minimal usage
import asyncio
from dot_search import SearchEngine
engine = SearchEngine(db_url="postgresql+asyncpg://user:pass@localhost/mydb")
async def main():
# Index — auto-serializes all columns, config saved to ds_configs
await engine.index(table="documents")
# Search
results = await engine.search("neural networks", "documents", limit=5)
for r in results:
print(r.id, r.score)
asyncio.run(main())
Config is persisted in ds_configs. After the first index(), re-index without re-providing config:
await engine.index(index_id="documents")
Power usage
import asyncio
from dot_search import SearchEngine, TableConfig, EmbeddingConfig, BM25Config, ExactConfig
engine = SearchEngine(db_url="postgresql+asyncpg://user:pass@localhost/mydb")
async def main():
# --- Index: multiple embeddings + BM25 + exact ---
await engine.index(config=TableConfig(
table="articles",
embeddings=[
EmbeddingConfig(source_column="body", default_weight=1.0),
EmbeddingConfig(source_column="title", default_weight=0.5),
EmbeddingConfig(
source_column=None, # serialize all columns into one vector
target_column="ds_articles_all", # required when source_column=None
default_weight=0.3,
),
],
bm25=[
BM25Config(source_column="title", default_weight=0.8),
BM25Config(source_column="body", default_weight=1.0),
],
exact=[ExactConfig(source_column="name")],
))
# --- Hybrid search (vector + BM25 + exact, fused via RRF) ---
results = await engine.search(
"fermentation and gut health",
"articles",
limit=10,
where="published_year >= 2022 AND topic = 'health'",
embedding_weights={
"ds_articles_body_default": 1.0,
"ds_articles_title_default": 0.3,
"ds_articles_all": 0.1,
},
bm25_weights={"title": 0.5, "body": 2.0},
)
# --- BM25-only ---
results = await engine.search("fermentation", "articles", strategy="bm25")
# --- Exact substring only ---
results = await engine.search("Dupont", "articles", strategy="exact")
# --- Multiple indexes on the same table ---
await engine.index(config=TableConfig(
table="articles",
index_id="article_titles",
embeddings=[EmbeddingConfig(source_column="title")],
))
results = await engine.search("gut health", "article_titles", limit=5)
asyncio.run(main())
Search strategies
| Strategy | What it uses |
|---|---|
"hybrid" |
Vector + BM25 + exact (any configured), fused via RRF (default) |
"vector" |
Vector similarity only |
"bm25" |
BM25 keyword search only |
"exact" |
Substring (LIKE) search only |
Contributing & Development
See docs/CONTRIBUTING.md and docs/DEVELOPMENT.md.
License
See LICENSE for details.
Contact
deepika Team — contact@deepika.ai Project: gitlab.com/deepika6190303/deepika-open-toolbox/dot-search
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dot_search-0.1.1.tar.gz.
File metadata
- Download URL: dot_search-0.1.1.tar.gz
- Upload date:
- Size: 66.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
91605f0f24838b83c727cc231157c3120890c104b28e7c0a8a9386786b75264b
|
|
| MD5 |
c7788a922f1691a7c823eed26a33d008
|
|
| BLAKE2b-256 |
7cabf79f4e1fa368a59d7a65761c3b33b73b00d142752e892d26e13bc0419fc9
|
File details
Details for the file dot_search-0.1.1-py3-none-any.whl.
File metadata
- Download URL: dot_search-0.1.1-py3-none-any.whl
- Upload date:
- Size: 13.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
14c3c9a1c338015d4c32eaf277de47fdf8d32ba7e483d0b97b4fc11392d1992a
|
|
| MD5 |
7824f1b67dfe504c6024e360ff917903
|
|
| BLAKE2b-256 |
1aad08dcc59d1dca82f60f3159aa0e19e1b205602d85906ed1052e471e4a43dd
|