A filtering system for Opensearch documents similar to django-filter, but designed to work with Opensearch queries instead of Django ORM.
pip install django-opensearch-dsl-filtering- Filter Opensearch documents using a familiar Django-like API
- Generate Django forms for your filters automatically
- Support for pagination and sorting
- Various filter types: CharFilter, NumericFilter, RangeFilter, DateFilter, BooleanFilter
from django_opensearch_dsl import Document
from django_opensearch_dsl_filtering import CharFilter, DateFilter, DocumentFilterSet, NumericFilter
# Assuming you have a Document class defined
class BookDocument(Document):
# Your document definition here
class Index:
name = "books"
class Django:
model = Book
fields = ["id"]
# Create a FilterSet for your document
class BookDocumentFilterSet(DocumentFilterSet):
document = BookDocument
# Define filters
title = CharFilter(field_name="title", lookup_expr="match", label="Title")
author = CharFilter(field_name="author", lookup_expr="match", label="Author")
publication_date = DateFilter(field_name="publication_date", label="Publication Date")
price = NumericFilter(field_name="price", label="Price")
price_min = NumericFilter(field_name="price", lookup_expr="gte", label="Min Price")
price_max = NumericFilter(field_name="price", lookup_expr="lte", label="Max Price")
# Define sorting options
SORT_CHOICES = [
("", "Default"),
("title", "Title (A-Z)"),
("-title", "Title (Z-A)"),
("price", "Price (Low to High)"),
("-price", "Price (High to Low)"),
]from django.shortcuts import render
def book_search(request):
# Create a filter set with the request data
filter_set = BookDocumentFilterSet(data=request.GET)
# Get the search results
search = filter_set.search()
results = search.execute()
# Get the form for rendering in the template
form = filter_set.get_form()
return render(
request,
"books/search.html",
{
"form": form,
"results": results,
},
)<form method="get">
{{ form.as_p }}
<button type="submit">Search</button>
</form>
<div class="results">
{% for result in results %}
<div class="result">
<h2>{{ result.title }}</h2>
<p>Author: {{ result.author }}</p>
<p>Price: ${{ result.price }}</p>
</div>
{% endfor %}
</div>CharFilter: For text fieldsNumericFilter: For numeric fieldsRangeFilter: For numeric fields with a rangeDateFilter: For date fieldsBooleanFilter: For boolean fields
Each filter can be customized with the following parameters:
field_name: The name of the field to filter onlookup_expr: The lookup expression to use (e.g., "match", "term", "wildcard", "gt", "lt", etc.)label: The label to use for the form field
MIT