Skip to main content

laurus-python

PyPI License: MIT

Python bindings for the Laurus search engine. Provides lexical search, vector search, and hybrid search from Python via a native Rust extension built with PyO3 and Maturin.

Features

  • Lexical Search -- Full-text search powered by an inverted index with BM25 scoring
  • Vector Search -- Approximate nearest neighbor (ANN) search using Flat, HNSW, or IVF indexes
  • Hybrid Search -- Combine lexical and vector results with fusion algorithms (RRF, WeightedSum)
  • Rich Query DSL -- Term, Phrase, Fuzzy, Wildcard, NumericRange, Geo, Boolean, Span queries
  • Text Analysis -- Tokenizers, filters, stemmers, and synonym expansion
  • Flexible Storage -- In-memory (ephemeral) or file-based (persistent) indexes
  • Pythonic API -- Clean, intuitive Python classes with full type information

Installation

pip install laurus

To build from source (requires Rust toolchain):

pip install maturin
maturin develop

Quick Start

import laurus

# Create an in-memory index
index = laurus.Index()

# Index documents
index.put_document("doc1", {"title": "Introduction to Rust", "body": "Systems programming language."})
index.put_document("doc2", {"title": "Python for Data Science", "body": "Data analysis with Python."})
index.commit()

# Search with a DSL string
results = index.search("title:rust", limit=5)
for r in results:
    print(f"[{r.id}] score={r.score:.4f}  {r.document['title']}")

# Search with a query object
results = index.search(laurus.TermQuery("body", "python"), limit=5)

Index Types

In-memory (ephemeral)

index = laurus.Index()

File-based (persistent)

schema = laurus.Schema()
schema.add_text_field("title")
schema.add_text_field("body")
schema.add_hnsw_field("embedding", dimension=384)

index = laurus.Index(path="./myindex", schema=schema)

Durability / WAL

A persistent index writes every change to a write-ahead log (WAL). By default the WAL is fsync-ed on every record, so each write is fully durable. Opt into group commit to batch fsync for higher write throughput (a crash can lose up to the last unsynced batch, like SQLite's synchronous = NORMAL):

import laurus

policy = laurus.WalSyncPolicy.group(max_records=4096, max_interval_ms=1000)
index = laurus.Index(path="./myindex", schema=schema, wal_sync_policy=policy)

index.put_document("doc1", {"title": "Hello"})
index.flush_wal()  # force a durable barrier on demand
index.commit()     # also flushes the WAL

Omit wal_sync_policy (or pass laurus.WalSyncPolicy.per_record()) to keep the default per-record durability.

Query Types

Query class Description
TermQuery(field, term) Exact term match
PhraseQuery(field, [terms]) Ordered phrase match
FuzzyQuery(field, term, max_edits) Approximate term match
WildcardQuery(field, pattern) Wildcard pattern match (*, ?)
NumericRangeQuery(field, min, max) Numeric range (int or float)
GeoDistanceQuery.within_radius(field, lat, lon, distance_m) Geo-distance radius search
GeoBoundingBoxQuery.within_bounding_box(field, min_lat, min_lon, max_lat, max_lon) Geo bounding-box search
Geo3dDistanceQuery.within_sphere(field, x, y, z, distance_m) 3D ECEF sphere search
Geo3dBoundingBoxQuery.within_box(field, min_x, min_y, min_z, max_x, max_y, max_z) 3D ECEF AABB search
Geo3dNearestQuery.k_nearest(field, x, y, z, k) 3D ECEF k-nearest neighbours
BooleanQuery(must, should, must_not) Compound boolean logic
SpanNearQuery(field, [terms], slop) Proximity / ordered span match
VectorQuery(field, vector) Pre-computed vector similarity
VectorTextQuery(field, text) Text-to-vector similarity (requires embedder)

Hybrid Search

request = laurus.SearchRequest(
    lexical_query=laurus.TermQuery("body", "rust"),
    vector_query=laurus.VectorQuery("embedding", query_vec),
    fusion=laurus.RRF(k=60.0),
    limit=10,
)
results = index.search(request)

Fusion algorithms

Class Description
RRF(k=60.0) Reciprocal Rank Fusion (rank-based, default for hybrid)
WeightedSum(lexical_weight=0.5, vector_weight=0.5) Score-normalised weighted sum

Text Analysis

syn_dict = laurus.SynonymDictionary()
syn_dict.add_synonym_group(["ml", "machine learning"])

tokenizer = laurus.WhitespaceTokenizer()
filt = laurus.SynonymGraphFilter(syn_dict, keep_original=True, boost=0.8)

tokens = tokenizer.tokenize("ml tutorial")
tokens = filt.apply(tokens)
for tok in tokens:
    print(tok.text, tok.position, tok.boost)

Examples

Usage examples are in the examples/ directory:

Example Description
quickstart.py Basic indexing and full-text search
lexical_search.py All query types (Term, Phrase, Boolean, Fuzzy, Wildcard, Range, Geo, Span)
vector_search.py Semantic similarity search with embeddings
hybrid_search.py Combining lexical and vector search with fusion
synonym_graph_filter.py Synonym expansion in the analysis pipeline
search_with_openai.py Cloud-based embeddings via OpenAI
multimodal_search.py Text-to-image and image-to-image search

Documentation

License

This project is licensed under the MIT License - see the LICENSE file for details.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

laurus-0.12.0.tar.gz (1.3 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

laurus-0.12.0-cp314-cp314-macosx_11_0_arm64.whl (9.0 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

laurus-0.12.0-cp314-cp314-macosx_10_12_x86_64.whl (9.6 MB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

laurus-0.12.0-cp313-cp313-win_arm64.whl (8.8 MB view details)

Uploaded CPython 3.13Windows ARM64

laurus-0.12.0-cp312-cp312-win_amd64.whl (9.3 MB view details)

Uploaded CPython 3.12Windows x86-64

laurus-0.12.0-cp312-cp312-manylinux_2_39_x86_64.whl (9.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

laurus-0.12.0-cp312-cp312-manylinux_2_39_aarch64.whl (9.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ ARM64

File details

Details for the file laurus-0.12.0.tar.gz.

File metadata

  • Download URL: laurus-0.12.0.tar.gz
  • Upload date:
  • Size: 1.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for laurus-0.12.0.tar.gz
Algorithm Hash digest
SHA256 f1fa524ecee0bfe23e095089e2fa15e07533e5da4e217f49bc16edaae5706660
MD5 9511ccade4bfd3fee4ca5a2152c14548
BLAKE2b-256 1dfede1ed6bb03fa7f4a063ae22c0217d28fe618fc3687dbb750e37f1a89b405

See more details on using hashes here.

File details

Details for the file laurus-0.12.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for laurus-0.12.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d36fdc03a6342f5676164101c4f879784f8fca9f8b3acf7ee94534fad2117333
MD5 54133ce88a7dced8e029c651c659c4a6
BLAKE2b-256 2396e7dc4b6ddec9e0b6c28c334c627ce43aa3d2621d88837781dc534ca52165

See more details on using hashes here.

File details

Details for the file laurus-0.12.0-cp314-cp314-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for laurus-0.12.0-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 baecc5ed254a9d97dc3e683615dc6b516c16f3bced252dbfffc0a0b9406b83cd
MD5 7fc75fe5813de3aa5b987028ec869861
BLAKE2b-256 2210d47e2315e1d7dc1f5a53dd6b38c06704e371bd5f658e6e19a3270df698dd

See more details on using hashes here.

File details

Details for the file laurus-0.12.0-cp313-cp313-win_arm64.whl.

File metadata

File hashes

Hashes for laurus-0.12.0-cp313-cp313-win_arm64.whl
Algorithm Hash digest
SHA256 938d600b989319e71d7fdaa0e31dc2383df62d82be548ca9e7b961a5055e7764
MD5 9f584615c8b3ac3e17375f0e25f0b1fd
BLAKE2b-256 b915eaa59da21960781afaf79f4ddb82d591d06ff84ca1b61eba632f13d45694

See more details on using hashes here.

File details

Details for the file laurus-0.12.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: laurus-0.12.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 9.3 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for laurus-0.12.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 67de5012b2e3d0bac29f8f0e1d92b0647411ea0252f7f134b05b1600e53fa227
MD5 6667943816dcae7fabe85a97f34598d3
BLAKE2b-256 673cde2661deb823982811110e52a4ded8d9b479e8abd3a57fae7195312279fa

See more details on using hashes here.

File details

Details for the file laurus-0.12.0-cp312-cp312-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for laurus-0.12.0-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 d753dde6ef1f5e5014f7ece1714e2f48415588a049e52a4be71cc0f7acde8af7
MD5 a5a8ad95d94d7c27cb24cd5bc5062c4c
BLAKE2b-256 baeb2e717103c21c05c0978d895b871792edd91ad5ee8adfa4a315223b488dad

See more details on using hashes here.

File details

Details for the file laurus-0.12.0-cp312-cp312-manylinux_2_39_aarch64.whl.

File metadata

File hashes

Hashes for laurus-0.12.0-cp312-cp312-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 94c5b0a5f863c7b81dbdcc9c81c12d348b638c13ff94ad78ad1365cf1b853b9c
MD5 55b5404e1ba4bf976e2350f468d95e51
BLAKE2b-256 5d5024bb175eabfee710cc4dda526c6859144f545aeab60ea2a335e728928e22

See more details on using hashes here.

Release history Release notifications | RSS feed

0.13.1

7 files

0.13.0

7 files

0.12.1

7 files

This release

0.12.0 This release

7 files

0.11.0

7 files

0.10.0

7 files

0.9.0

7 files

0.8.0

7 files

0.7.0

7 files

0.6.0

7 files

0.5.0

7 files

0.4.2

7 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page