Full-text search and indexing for Lexigram Framework - Elasticsearch, Meilisearch, and Algolia
Project description
lexigram-search
Full-text search and indexing for Lexigram Framework — Elasticsearch, Meilisearch, and Algolia
Overview
lexigram-search provides a unified SearchEngineProtocol interface over Meilisearch, Elasticsearch, Typesense, PostgreSQL full-text, MySQL, MongoDB, and SQLite. It supports typo-tolerant search, faceting, fuzzy matching, result caching, and analytics. All services are wired via SearchProvider, which registers the search engine protocol with the DI container.
Install
uv add lexigram-search
# Optional extras
uv add "lexigram-search[meilisearch]" # Meilisearch
uv add "lexigram-search[elasticsearch]" # Elasticsearch 8.x
uv add "lexigram-search[typesense]" # Typesense
uv add "lexigram-search[postgres,mysql,sqlite,mongodb]" # Database backends
Quick Start
from lexigram import Application
from lexigram.di.module import Module, module
# Import the module from the package
from lexigram.search import SearchModule
@module(imports=[SearchModule.configure(...)])
class AppModule(Module):
pass
app = Application(modules=[AppModule])
if __name__ == "__main__":
app.run()
Configuration
Zero-config usage: Call
SearchModule.configure()with no arguments to use defaults.
Option 1 — YAML file
# application.yaml
search:
backend_type: meilisearch
meilisearch:
url: http://localhost:7700
api_key: "${MEILI_API_KEY}"
query:
strategy: fuzzy
default_limit: 10
Option 2 — Profiles + Environment Variables (recommended)
export LEX_SEARCH__ENABLED=true
# Environment variables for each field
Option 3 — Python
from lexigram.search.config import SearchConfig, BackendType
from lexigram.search import SearchModule
config = SearchConfig(backend_type=BackendType.MEILISEARCH, ...)
SearchModule.configure(config)
Config reference
| Field | Default | Env var | Description |
|---|---|---|---|
backend_type |
memory |
LEX_SEARCH__BACKEND_TYPE |
Active backend (meilisearch, elasticsearch, typesense, postgres, mysql, sqlite, memory) |
timeout |
30.0 |
LEX_SEARCH__TIMEOUT |
Default request timeout in seconds |
query.strategy |
fuzzy |
LEX_SEARCH__QUERY__STRATEGY |
Query strategy (fuzzy, exact, semantic, hybrid) |
query.default_limit |
10 |
LEX_SEARCH__QUERY__DEFAULT_LIMIT |
Default number of results returned |
query.max_limit |
100 |
LEX_SEARCH__QUERY__MAX_LIMIT |
Maximum allowed result limit |
query.fuzzy_threshold |
0.8 |
LEX_SEARCH__QUERY__FUZZY_THRESHOLD |
Fuzzy match threshold (0–1; 1 = exact) |
meilisearch.url |
http://localhost:7700 |
LEX_SEARCH__MEILISEARCH__URL |
MeiliSearch server URL |
meilisearch.api_key |
null |
LEX_SEARCH__MEILISEARCH__API_KEY |
MeiliSearch authentication key |
elasticsearch.hosts |
[http://localhost:9200] |
LEX_SEARCH__ELASTICSEARCH__HOSTS |
Elasticsearch cluster hosts |
operations.bulk_chunk_size |
500 |
LEX_SEARCH__OPERATIONS__BULK_CHUNK_SIZE |
Documents per bulk index request |
Module Factory Methods
| Method | Description |
|---|---|
SearchModule.configure(config, enable_facets) |
Configure with explicit SearchConfig |
SearchModule.stub() |
Minimal config for testing |
Key Features
- Protocol abstraction — Swap backends without changing application code
- Meilisearch — Typo-tolerant, instant search with faceting
- Elasticsearch — Full Lucene query DSL; aggregations; multi-index
- Typesense — Fast, schema-enforced search with scoped API keys
- PostgreSQL FTS —
tsvector/tsqueryvialexigram-sql; no extra infra - MySQL FTS —
FULLTEXTindex support for MySQL / MariaDB - MongoDB Text — Native
$textoperator with language stemming - SQLite FTS5 — Local development with zero dependencies
- Cached search — Transparent result caching via
CacheBackend - Analytics — Query recording and hit-rate analytics for ranking improvement
Testing
async with Application.boot(modules=[SearchModule.stub()]) as app:
# your test code
...
Key Source Files
| File | What it contains |
|---|---|
src/lexigram/search/module.py |
SearchModule class with factory methods |
src/lexigram/search/di/provider.py |
SearchProvider — wires search protocols into DI container |
src/lexigram/search/config.py |
SearchConfig and sub-config classes |
src/lexigram/search/engine/ |
Search engine implementations for each backend |
src/lexigram/search/indexer/ |
Index management and document indexing |
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
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 lexigram_search-0.1.1-py3-none-any.whl.
File metadata
- Download URL: lexigram_search-0.1.1-py3-none-any.whl
- Upload date:
- Size: 134.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
366fd8982296eecc7786b881d979e2f001797e7e45b200e9347e299ea0e646e4
|
|
| MD5 |
9f9bae2c563fc350b0bc247537fa73cb
|
|
| BLAKE2b-256 |
f00b190e541ec831a994072b19475dcf6787f22010a264f2da1a197d579c4688
|