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.10.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.10.0-cp314-cp314-macosx_11_0_arm64.whl (8.3 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

laurus-0.10.0-cp314-cp314-macosx_10_12_x86_64.whl (8.9 MB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

laurus-0.10.0-cp313-cp313-win_arm64.whl (8.1 MB view details)

Uploaded CPython 3.13Windows ARM64

laurus-0.10.0-cp312-cp312-win_amd64.whl (8.5 MB view details)

Uploaded CPython 3.12Windows x86-64

laurus-0.10.0-cp312-cp312-manylinux_2_39_x86_64.whl (11.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

laurus-0.10.0-cp312-cp312-manylinux_2_39_aarch64.whl (10.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ ARM64

File details

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

File metadata

  • Download URL: laurus-0.10.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.10.0.tar.gz
Algorithm Hash digest
SHA256 1a42fb9cb6efc9acd0001225ad596c598269adac6cd89c1db3ea3a1b1ea8a628
MD5 8af3b5d62885ceb1512ab8bfec0def61
BLAKE2b-256 1c7bb91ff3cea77f5035b00396910d97b39c8d71ab818fe4ec44ad2d194fe7a9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for laurus-0.10.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bf08474c031c011a43837c26e2b3f990c97afc752fc9338b07825a4e2f0bff52
MD5 e5c8c84995a84855d78ffee96b90ca79
BLAKE2b-256 b2aac377476fb842dc01fcdf70f355922f34472c0f80d7666f3a083405f35926

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for laurus-0.10.0-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 03338b9f26c3486ffa9f0f89c815fe4f20b75e6c620b1ef8c307dfb6adea60e5
MD5 bf4f0324bf6ccbaa5fc2d9da68dd7c32
BLAKE2b-256 3e48cce7d046feb870ffae27aafbec974d3e091ff38155c7ab1d11a8880f062b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for laurus-0.10.0-cp313-cp313-win_arm64.whl
Algorithm Hash digest
SHA256 4c2ba6d56ef551e9b3235686427a647baa3b9583725f99f248c32e7b6c13ea2f
MD5 be61ffac083cc8be7ea6236b2c60a8e9
BLAKE2b-256 a224f5f297e832202676f24ff7126c2811ef22e1d33f32bb05a8eb2985fc05af

See more details on using hashes here.

File details

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

File metadata

  • Download URL: laurus-0.10.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 8.5 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.10.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 a842b207d11afd5298a3bb1595767e442e4437d5cd3ea201484b839bee40b88e
MD5 ff196f017ff94919af905460365c5936
BLAKE2b-256 d6d1887d461e094808bf33478e46da72fb1d21f6b837692f009c086cb570bdb4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for laurus-0.10.0-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 ebd47decc8e1b522d82ba7f738e88b660d8b7b300f60715c832fea50c77f74dc
MD5 05335d563d85a14f540f9ff1e7804c94
BLAKE2b-256 e0e687f839bd9cae8269eab267128dc10a04aa13e1035eea4d53039de1606f55

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for laurus-0.10.0-cp312-cp312-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 0a4510c143c76b89dd84c9b41b2b1a7d578fadde872ee62c04e7b6467d3acea5
MD5 b9539f18e39c6d70c329eab9a03b4998
BLAKE2b-256 f15ab5d771fb26ec5835baca5001bd1841b942136ced2b76cb14ddb07b0ee9a4

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

0.12.0

7 files

0.11.0

7 files

This release

0.10.0 This release

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