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.


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.1.tar.gz (19.2 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.1-py3-none-any.whl (21.6 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: arvel_search-0.5.1.tar.gz
  • Upload date:
  • Size: 19.2 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.1.tar.gz
Algorithm Hash digest
SHA256 7938dc1b548c75cfcc1ab15fd902dbc1c2a9613df61d78903593651d14ceebec
MD5 accd646da1791f5f8a371dae957123b7
BLAKE2b-256 17ae778dea260cc0746a7c063d8e9680c4e060dd21139117845527b4c8839891

See more details on using hashes here.

Provenance

The following attestation bundles were made for arvel_search-0.5.1.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.1-py3-none-any.whl.

File metadata

  • Download URL: arvel_search-0.5.1-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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 7446dc0fd90fddcd8eaaa61cc3f623c1e503463b7af260dcc465b24749258102
MD5 4332f0ec9a4a12ac70cc88918b370fe7
BLAKE2b-256 619d19c32b1b08966556a9ba5d2d9e9fd669ae70b795c732b5f60b1241d1ed91

See more details on using hashes here.

Provenance

The following attestation bundles were made for arvel_search-0.5.1-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