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

Uploaded Python 3

File details

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

File metadata

  • Download URL: arvel_search-0.6.1.tar.gz
  • Upload date:
  • Size: 19.4 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.1.tar.gz
Algorithm Hash digest
SHA256 43e763e07076c9376cc9c3fa7aa5d4857e1273d815d9e90870787df59692b913
MD5 b8c7ea99a4347dd08b5f42c2f84501c4
BLAKE2b-256 65c7749991c052b2721e10f098150a9d40349e1e569650c5721b3fe42de28d14

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: arvel_search-0.6.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.6.1-py3-none-any.whl
Algorithm Hash digest
SHA256 711ae149f69dc4585b2bc10e3271101867c2bd7a1446892facf944fac801e0b4
MD5 1a3a6a42a27f4c0f29cc2e7a89c8522c
BLAKE2b-256 30c40054296a756e612c40d5bedde6ae1aaf79af74e7d917016f008c20969dea

See more details on using hashes here.

Provenance

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