Skip to main content

Scout-style full-text search for Arvel — Meilisearch, Elasticsearch, database, collection, and null drivers.

Project description

arvel-search

PyPI MIT License

Scout-style full-text search for Arvel.

Add the Searchable mixin to a model, declare __searchable__, and records sync to your search backend automatically on create / update / delete. Query with a fluent Model.search("term") builder. Swap backends — Meilisearch, Elasticsearch, database (ILIKE), in-memory collection, or null — entirely through config.

Status: Pre-alpha — v0.3.0.


Documentation: https://arvel.dev/packages/search


Install

uv add "arvel[search]"
# or: pip install arvel-search

Register the provider in bootstrap/providers.py:

from arvel_search import SearchServiceProvider

providers = [
    # ...other providers...
    SearchServiceProvider,
]

The provider registers SearchConfig and SearchManager, binds the Search facade, and registers the SearchIndexJob / SearchRemoveJob queue jobs. There are no migrations.

Quick start

from arvel.database import Model, id_, string
from arvel_search import Searchable


class Article(Model, Searchable):
    __tablename__ = "articles"
    __searchable__ = ("title", "body")

    id: int = id_()
    title: str = string(200)
    body: str = string(2000)


# Saving auto-indexes; deleting auto-removes (when an engine is bound).
article = await Article.create(title="Python tips", body="...")

# Fluent search, hydrated back into models.
results = await Article.search("python").limit(10).get()      # list[Article]
ids = await Article.search("python").keys()
total = await Article.search("python").count()
page = await Article.search("python").paginate(per_page=15, page=1)

The builder supports where(column, value), limit, offset, plus the terminal methods get, first, keys, count, and paginate.

Optional class attributes: __search_index__ (index name; defaults from the table) and __search_key__ (document key; defaults to id). Override to_searchable_array() to control the indexed document.

Drivers

SEARCH_DRIVER picks the backend (default database):

Driver Behavior
database ILIKE against the model's own table. Writes are no-ops — no separate index.
collection In-memory substring match. Dev/test only.
null Swallows writes; search returns nothing.
meilisearch Talks to a Meilisearch server over HTTP. Set SEARCH_MEILISEARCH_URL / _KEY.
elasticsearch Talks to Elasticsearch over HTTP. Set SEARCH_ELASTICSEARCH_URL / _KEY.

The Meilisearch and Elasticsearch drivers send documents and queries only — they don't create indices or mappings. Make sure the index exists on the server first.

Testing

from arvel_search import Search

fake = Search.fake()
article = await Article.create(title="Hello", body="...")
fake.assert_indexed(article)
Search.restore()

See the full guide for custom engines and queued sync.

License

MIT — see LICENSE.

Project details


Download files

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

Source Distribution

arvel_search-0.5.0.tar.gz (19.1 kB view details)

Uploaded Source

Built Distribution

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

arvel_search-0.5.0-py3-none-any.whl (21.6 kB view details)

Uploaded Python 3

File details

Details for the file arvel_search-0.5.0.tar.gz.

File metadata

  • Download URL: arvel_search-0.5.0.tar.gz
  • Upload date:
  • Size: 19.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for arvel_search-0.5.0.tar.gz
Algorithm Hash digest
SHA256 769e1972bfef38e21f0481314a61f6f23d8b375aee9a43130cce258337ab2f20
MD5 becc7ff4b79be4e21bedc356beabad7d
BLAKE2b-256 6cefe46f219475f1f264e3dee6e38886fb8a33deb44eb8a02ae980734b769232

See more details on using hashes here.

Provenance

The following attestation bundles were made for arvel_search-0.5.0.tar.gz:

Publisher: publish.yml on mohamed-rekiba/arvel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file arvel_search-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: arvel_search-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 21.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for arvel_search-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f6d4a3093b72baaf675f0ecb44226b4db03401526d95a9a520302d3ae26574c1
MD5 b6c44a2a54f6eea6a281d9b21c25bfa0
BLAKE2b-256 915e373b4d4472fa0923078fd1d3d7cd8c61b809ad124ecfb215f1963ae6fb60

See more details on using hashes here.

Provenance

The following attestation bundles were made for arvel_search-0.5.0-py3-none-any.whl:

Publisher: publish.yml on mohamed-rekiba/arvel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page