ICVOSS DJANGO PACKAGE REGISTRY

The package index django-icv-search Search Backend Comparison Guide

Search Backend Comparison Guide

Documentation

A reference for choosing, installing, and configuring the right search backend for your project.


Quick Comparison

Backend Best For Scale Infra Required SDK Install
Meilisearch Small to medium catalogues, developer experience Single-node None (default) httpx (bundled) pip install django-icv-search
PostgreSQL Zero-infrastructure, small datasets Existing Postgres None (bundled) psycopg2 (via Django) pip install django-icv-search
OpenSearch Large-scale, rich aggregations Distributed cluster OpenSearch cluster opensearch-py pip install django-icv-search[opensearch]
Solr Massive catalogues, deep faceting SolrCloud cluster Solr + ZooKeeper pysolr pip install django-icv-search[solr]
Typesense Medium to large, typo tolerance, instant search HA cluster Typesense cluster typesense pip install django-icv-search[typesense]
Vespa Billions of documents, ML ranking, hybrid search Vespa cluster Vespa cluster pyvespa pip install django-icv-search[vespa]
Dummy Testing only In-memory None (bundled) (none) pip install django-icv-search

Decision Flowchart

Start
  │
  ├── Testing / CI only?
  │     └── DummyBackend
  │
  ├── No external infra (zero ops overhead)?
  │     └── PostgreSQL backend
  │
  ├── Less than ~1M docs, want fast setup?
  │     └── Meilisearch  ← start here for most projects
  │
  ├── Need rich aggregations / analytics / comparison shopping?
  │     └── OpenSearch
  │
  ├── Need deep faceting over a massive catalogue?
  │     └── Solr
  │
  ├── Need typo tolerance / instant-search feel?
  │     └── Typesense
  │
  └── Need ML ranking / hybrid vector+text / billions of docs?
        └── Vespa

When in doubt, start with Meilisearch. It is the default backend, requires no infrastructure beyond a single Docker container, and covers the majority of search use cases up to ~20M documents.


Feature Support Matrix

Feature Meilisearch PostgreSQL OpenSearch Solr Typesense Vespa Dummy
Full-text search Yes Yes Yes Yes Yes Yes Yes (basic)
Filtering Yes Yes Yes Yes Yes Yes Yes
Sorting Yes Yes Yes Yes Yes Yes Yes
Faceting Yes Yes Yes Yes Yes Yes (grouping) Yes
Facet search Yes No Yes (regex) Yes (prefix) Yes No Yes
Highlighting Yes Yes (ts_headline) Yes Yes Yes Yes (bolding) Yes (basic)
Geo search Yes Yes (Haversine) Yes No Yes Yes (geoLocation) Yes (Haversine)
Similar documents Yes (embedders) No Yes (MLT) Yes (MLT) No No Yes (stub)
Multi-search Yes No Yes (_msearch) No Yes No No
Index swap Yes No Yes (aliases) Yes (aliases) Yes (aliases) No Yes
Partial updates No (full upsert) Yes (JSONB merge) Yes Yes (atomic) Yes (emplace) Yes (assign) Yes
Async tasks Yes No (sync) No (sync) No (sync) No (sync) No (sync) No (sync)
NDJSON import Yes No Yes (streaming_bulk) No No No Yes
Compaction No-op (auto) No-op forcemerge optimize No-op (auto) No-op (auto) No-op
Multi-tenancy Yes (index prefix) Yes (index prefix) Yes (index prefix) Yes (index prefix) Yes (index prefix) Yes (index prefix) Yes

Notes: - "Facet search" means searching within facet values for typeahead filter UIs. - "Similar documents" requires embedders configured in Meilisearch, the MoreLikeThis handler configured in Solr, and nearestNeighbor tensor fields in Vespa. - Vespa faceting uses its grouping syntax via the facets param; the facet_search() method is not supported. - Multi-tenancy is implemented across all backends via ICV_SEARCH_INDEX_PREFIX and/or ICV_SEARCH_TENANT_PREFIX_FUNC at the index naming level.


Individual Backend Guides