Skip to content

Commit b3778fa

Browse files
example nested facet backend
1 parent 319da6e commit b3778fa

File tree

3 files changed

+66
-8
lines changed

3 files changed

+66
-8
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from .nested_continents import *
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
from django_elasticsearch_dsl_drf.filter_backends.mixins import (
2+
FilterBackendMixin,
3+
)
4+
from rest_framework.filters import BaseFilterBackend
5+
6+
__all__ = ('NestedContinentsBackend',)
7+
8+
9+
class NestedContinentsBackend(BaseFilterBackend, FilterBackendMixin):
10+
"""Adds nesting to continents."""
11+
12+
faceted_search_param = 'nested_facet'
13+
14+
def get_faceted_search_query_params(self, request):
15+
"""Get faceted search query params.
16+
17+
:param request: Django REST framework request.
18+
:type request: rest_framework.request.Request
19+
:return: List of search query params.
20+
:rtype: list
21+
"""
22+
query_params = request.query_params.copy()
23+
return query_params.getlist(self.faceted_search_param, [])
24+
25+
def filter_queryset(self, request, queryset, view):
26+
"""Filter the queryset.
27+
:param request: Django REST framework request.
28+
:param queryset: Base queryset.
29+
:param view: View.
30+
:type request: rest_framework.request.Request
31+
:type queryset: elasticsearch_dsl.search.Search
32+
:type view: rest_framework.viewsets.ReadOnlyModelViewSet
33+
:return: Updated queryset.
34+
:rtype: elasticsearch_dsl.search.Search
35+
"""
36+
facets = self.get_faceted_search_query_params(request)
37+
38+
if 'continent' in facets:
39+
queryset \
40+
.aggs\
41+
.bucket('continents',
42+
'nested',
43+
path='continent') \
44+
.bucket('continent_name',
45+
'terms',
46+
field='continent.name.raw',
47+
size=10) \
48+
.bucket('counties',
49+
'nested',
50+
path='continent.country') \
51+
.bucket('country_name',
52+
'terms',
53+
field='continent.country.name.raw',
54+
size=10) \
55+
.bucket('city',
56+
'nested',
57+
path='continent.country.city') \
58+
.bucket('city_name',
59+
'terms',
60+
field='continent.country.city.name.raw',
61+
size=10)
62+
63+
return queryset

examples/simple/search_indexes/viewsets/address.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from django_elasticsearch_dsl_drf.pagination import LimitOffsetPagination
2020
from django_elasticsearch_dsl_drf.viewsets import DocumentViewSet
2121

22+
from ..backends import NestedContinentsBackend
2223
from ..documents import AddressDocument
2324
from ..serializers import AddressDocumentSerializer
2425

@@ -40,6 +41,7 @@ class AddressDocumentViewSet(DocumentViewSet):
4041
SearchFilterBackend,
4142
GeoSpatialFilteringFilterBackend,
4243
GeoSpatialOrderingFilterBackend,
44+
NestedContinentsBackend,
4345
DefaultOrderingFilterBackend,
4446
SuggesterFilterBackend,
4547
]
@@ -120,12 +122,4 @@ class AddressDocumentViewSet(DocumentViewSet):
120122
'field': 'city.country.name.raw',
121123
'enabled': True,
122124
},
123-
'city2': {
124-
'field': 'country.city.name.raw',
125-
'enabled': True,
126-
},
127-
'country2': {
128-
'field': 'country.name.raw',
129-
'enabled': True,
130-
},
131125
}

0 commit comments

Comments
 (0)