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.6.2.tar.gz (20.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.6.2-py3-none-any.whl (22.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: arvel_search-0.6.2.tar.gz
  • Upload date:
  • Size: 20.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.6.2.tar.gz
Algorithm Hash digest
SHA256 99636aa3381a8ed2e5fcb40b0218b3da0269a55410df958c733d9be89ea92ad0
MD5 258e5aa12466da4b0a46bfe4c71a1a94
BLAKE2b-256 a7d95077af179726369ec7081a3c4247748ba36f0b4180ca7a9a4c23e1a3cabb

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: arvel_search-0.6.2-py3-none-any.whl
  • Upload date:
  • Size: 22.0 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.6.2-py3-none-any.whl
Algorithm Hash digest
SHA256 fa68fb7a214ab0697d4e429c0b49a487d16026af3a05ea3e9da97e4b335f3748
MD5 b67ad8ee795fb3083ee22fa570e07c26
BLAKE2b-256 b0e924e9da03568bb656277b1a3bea0a7ed62c3abea267263cda739b3a0438da

See more details on using hashes here.

Provenance

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