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.11.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.11.0-cp314-cp314-macosx_11_0_arm64.whl (8.2 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

laurus-0.11.0-cp314-cp314-macosx_10_12_x86_64.whl (8.7 MB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

laurus-0.11.0-cp313-cp313-win_arm64.whl (8.0 MB view details)

Uploaded CPython 3.13Windows ARM64

laurus-0.11.0-cp312-cp312-win_amd64.whl (8.3 MB view details)

Uploaded CPython 3.12Windows x86-64

laurus-0.11.0-cp312-cp312-manylinux_2_39_x86_64.whl (9.0 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

laurus-0.11.0-cp312-cp312-manylinux_2_39_aarch64.whl (8.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ ARM64

File details

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

File metadata

  • Download URL: laurus-0.11.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.11.0.tar.gz
Algorithm Hash digest
SHA256 3306de7f5cfdead684436a2a74d9cec69ea255f0e1c178c054955fa30e28931b
MD5 7c0f3524ce34bc632a8d655fdf5e91f4
BLAKE2b-256 92f21e56a7958f3f375ac958606615fda65350ade7e25621681fa5553fe060ad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for laurus-0.11.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 039afd5aa23b78a0bac091d92404fbc0c633f3272213fcef3e1c098f901415a1
MD5 59dd00e318ae491e773817af64a3ab63
BLAKE2b-256 2b5e18bef42d2d957f6c738787f791a3be1ab5ae844bcfcafbee700bbf95bc15

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for laurus-0.11.0-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 dd2abc94d15a0a005a691623dee49e66707fc13c600065328e844b54762282cf
MD5 d79653b92951d38d8f4e432965563c1f
BLAKE2b-256 1732882578b6c38b773a0b2aa2b4fde776efc18b02e7e46f46d35a3bb942741c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for laurus-0.11.0-cp313-cp313-win_arm64.whl
Algorithm Hash digest
SHA256 d9db993a3deafa157360866c6ccda2e99007c633a4d720cceb1376a3e8875094
MD5 1e58595c06c3c0b7552d3b10c8428477
BLAKE2b-256 d3545d116cd92d52a8097a062bdab86d38f8042e6770b5dbf4d2dcea9afc69d9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: laurus-0.11.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 8.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.11.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 c56263e2003ba066860b1a21766517e7ad3c321e459226ba2f41a504eebb5450
MD5 33901ed6d435fb24d6a2fc73c91dcb52
BLAKE2b-256 ffc638bd275464d7bcb87d99b16579698e4c5e625a3e2927f2e97e419dbd7f03

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for laurus-0.11.0-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 f659c6e4dcf9c4acf5f7d1ad02664d1d6c4d48853213ed01edf29075c81530d4
MD5 5a0937d222ff8e93365e8bf6181e5d4f
BLAKE2b-256 0cd7088a0bcd7145b752f14efedf9c02e9dfb4a7b183617d5be393f515a820bf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for laurus-0.11.0-cp312-cp312-manylinux_2_39_aarch64.whl
Algorithm Hash digest
SHA256 a6ebc99f0ac96d9a812ace67d6e4a0ad4fddbe66bc217987d080193206cc3f9c
MD5 aa93774e5e7461d59d8566d4f5a60c3c
BLAKE2b-256 e4f7ef441a4a588f4141d311d3ae396d8abac44a2c3709403b3598262cdddf23

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

This release

0.11.0 This release

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