Skip to content

caltechads/django-haystack-opensearch

Repository files navigation

django_haystack_opensearch

An OpenSearch backend for django-haystack.

Documentation: https://django_haystack_opensearch.readthedocs.io

django_haystack_opensearch provides a drop-in replacement for Elasticsearch backends, allowing you to use OpenSearch (versions 1.x through 3.x) as your search engine with django-haystack. It uses the opensearch-py client library only, instead of the out-of-date elasticsearch client library.

Core Features

  • Full-Text Search with OpenSearch: Powerful full-text search capabilities with support for complex queries and relevance scoring.
  • Faceting and Filtering: Support for field, date, and query facets. Efficient filtering on facet fields (requires __exact suffix).
  • Spatial/Geo Search: Geographic location search, distance-based queries, and bounding box searches.
  • More Like This: Similarity search to find related documents.
  • Highlighting and Spelling Suggestions: Highlight search terms in results and provide automatic spelling correction.
  • Complete Haystack Compatibility: Supports all standard Haystack features including field boosting, stored fields, and multiple connections.

Requirements

  • Python 3.11 or later
  • Django 5.2 or later
  • OpenSearch 1.x through 3.x
  • django-haystack 3.3.0 or later

Quick Start

1. Installation

Install the package using pip:

pip install django_haystack_opensearch

Or using uv:

uv add django_haystack_opensearch

2. Configuration

Add haystack to your INSTALLED_APPS in settings.py:

INSTALLED_APPS = [
    # ...
    "haystack",
]

Configure the Haystack connection:

HAYSTACK_CONNECTIONS = {
    "default": {
        "ENGINE": "django_haystack_opensearch.haystack.OpenSearchSearchEngine",
        "URL": "http://localhost:9200",
        "INDEX_NAME": "haystack",
    },
}

3. Usage

Define your search indexes as usual. When filtering on facet fields, remember to use the __exact suffix:

from haystack.query import SearchQuerySet

# Filter by a facet field (requires __exact)
results = SearchQuerySet().filter(author__exact="John Doe")

Common Use Cases

  • Adding Search to Django Applications: Quickly add powerful search functionality to any Django project.
  • Migrating from Elasticsearch to OpenSearch: A drop-in replacement for existing Elasticsearch backends with no code changes required.
  • Building Faceted Search Interfaces: Create complex filter interfaces with accurate facet counts.

Getting Help

  • Check the Documentation for detailed guides and examples.
  • Report bugs or request features on the GitHub Issues page.
  • Explore the sandbox/ directory for a complete demonstration application.

About

A pure opensearch-py based backend for using django-haystack with opensearch clusters

Resources

License

Code of conduct

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published