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.1.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.1-cp314-cp314-macosx_11_0_arm64.whl (9.0 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.14macOS 10.12+ x86-64

laurus-0.12.1-cp313-cp313-win_arm64.whl (8.9 MB view details)

Uploaded CPython 3.13Windows ARM64

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

Uploaded CPython 3.12Windows x86-64

laurus-0.12.1-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.1-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.1.tar.gz.

File metadata

  • Download URL: laurus-0.12.1.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.1.tar.gz
Algorithm Hash digest
SHA256 8c4cb3ca23b5d259b615515895600c85d9a209edc786b76a911cb9988b8e1af2
MD5 56ebc7605751aa54902fbe3422c37ac7
BLAKE2b-256 c3bf82707afbfa452b8b1d5f04e87bc783455b237be5a3c13c408e6222e9ab33

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for laurus-0.12.1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9bc36f30444d3f19a435e31160fcd1551c3ec61864b3e15f3ec4343169ca98a0
MD5 f78184ba2ad722fbc010796126393670
BLAKE2b-256 6b0b1acd1734981ed0d7a89ae0a69707be7e62fac553199db6dc19ee3205df56

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for laurus-0.12.1-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 23afee09a504ec91eca325c388710784e75f872e345340bd084e8c8ea2ae4079
MD5 44117ec4da0f3a97f4563a0055be739b
BLAKE2b-256 548d26e0eb860d2919463de3d70456b11ae48d92d10fd665b5a9a105fc7709ad

See more details on using hashes here.

File details

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

File metadata

  • Download URL: laurus-0.12.1-cp313-cp313-win_arm64.whl
  • Upload date:
  • Size: 8.9 MB
  • Tags: CPython 3.13, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for laurus-0.12.1-cp313-cp313-win_arm64.whl
Algorithm Hash digest
SHA256 576f21e3a52c36aa3838ff3b302704cf309d0f2ab46a802e53f97c15e04ab15d
MD5 16b8314e8aa0bb49c325af05e69ebf2b
BLAKE2b-256 8df63234a7a4c5c13d868b646bae8d42104b9e4ec7dcb23da8b81ed0ac536cdb

See more details on using hashes here.

File details

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

File metadata

  • Download URL: laurus-0.12.1-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.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 b1ec7a38eb222912f88f4058041f95cfe7c7c86a8a4c172b413d230cdc473a45
MD5 9bfec6e50fe0b66091e12631da30f49f
BLAKE2b-256 b53e8efc0060e94f81a831dff98e6b9f4abb428137432921553ae37e60afc9dd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for laurus-0.12.1-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 300e6797925548f2a91ee6a94a99d42ec1624a395b44cab9a5a18d6fab7d157f
MD5 926e5e4abec6b8ca8102c21d8fbb0c70
BLAKE2b-256 a4b8380a5219976d02a415d7381b3f3e6c87104b7f164ab8196e820227a1564d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for laurus-0.12.1-cp312-cp312-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 0a79d64168451cb68c6d9f53ecd2649f05737b5604e9cc3004cad14b1bee4290
MD5 b13a11af80ff8bcdff5c681d93ee81fa
BLAKE2b-256 515542b1b16362fb222868c841a5774fa30e0b8aabff831584fe2c09c11bb533

See more details on using hashes here.

Release history Release notifications | RSS feed

0.13.1

7 files

0.13.0

7 files

This release

0.12.1 This release

7 files

0.12.0

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