# Architecture Overview

## `SearchQuerySet`

One main implementation.

- Standard API that loosely follows `QuerySet`

- Handles most queries

- Allows for custom “parsing”/building through API

- Dispatches to `SearchQuery` for actual query

- Handles automatically creating a query

- Allows for raw queries to be passed straight to backend.

## `SearchQuery`

Implemented per-backend.

- Method for building the query out of the structured data.

- Method for cleaning a string of reserved characters used by the backend.

Main class provides:

- Methods to add filters/models/order-by/boost/limits to the search.

- Method to perform a raw search.

- Method to get the number of hits.

- Method to return the results provided by the backend (likely not a full list).

## `SearchBackend`

Implemented per-backend.

- Connects to search engine

- Method for saving new docs to index

- Method for removing docs from index

- Method for performing the actual query

## `SearchSite`

One main implementation.

- Standard API that loosely follows `django.contrib.admin.sites.AdminSite`

- Handles registering/unregistering models to search on a per-site basis.

- Provides a means of adding custom indexes to a model, like `ModelAdmins`.

## `SearchIndex`

Implemented per-model you wish to index.

- Handles generating the document to be indexed.

- Populates additional fields to accompany the document.

- Provides a way to limit what types of objects get indexed.

- Provides a way to index the document(s).

- Provides a way to remove the document(s).