From e6b353e864cd303302bddadf16a010ae54b4b956 Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Thu, 21 Nov 2019 21:59:24 +0300 Subject: [PATCH] ES Facets in addition to results --- .../search_indexes/documents/establishment.py | 1 + apps/search_indexes/views.py | 65 +++++++++++++++++-- apps/utils/pagination.py | 20 +++++- 3 files changed, 78 insertions(+), 8 deletions(-) diff --git a/apps/search_indexes/documents/establishment.py b/apps/search_indexes/documents/establishment.py index 45923182..17f657b1 100644 --- a/apps/search_indexes/documents/establishment.py +++ b/apps/search_indexes/documents/establishment.py @@ -46,6 +46,7 @@ class EstablishmentDocument(Document): 'id': fields.IntegerField(attr='id'), 'label': fields.ObjectField(attr='label_indexing', properties=OBJECT_FIELD_PROPERTIES), + 'index_name': fields.KeywordField(attr='value'), }, multi=True) visible_tags = fields.ObjectField( diff --git a/apps/search_indexes/views.py b/apps/search_indexes/views.py index 783754c7..0be3e007 100644 --- a/apps/search_indexes/views.py +++ b/apps/search_indexes/views.py @@ -4,13 +4,15 @@ from django_elasticsearch_dsl_drf import constants from django_elasticsearch_dsl_drf.filter_backends import ( FilteringFilterBackend, GeoSpatialFilteringFilterBackend, - DefaultOrderingFilterBackend, + FacetedSearchFilterBackend, + CompoundSearchFilterBackend, ) +from elasticsearch_dsl import TermsFacet, RangeFacet from django_elasticsearch_dsl_drf.viewsets import BaseDocumentViewSet from search_indexes import serializers, filters from search_indexes.documents import EstablishmentDocument, NewsDocument from search_indexes.documents.product import ProductDocument -from utils.pagination import ProjectMobilePagination +from utils.pagination import ESDocumentPagination class NewsDocumentViewSet(BaseDocumentViewSet): @@ -18,15 +20,30 @@ class NewsDocumentViewSet(BaseDocumentViewSet): document = NewsDocument lookup_field = 'slug' - pagination_class = ProjectMobilePagination + pagination_class = ESDocumentPagination permission_classes = (permissions.AllowAny,) serializer_class = serializers.NewsDocumentSerializer filter_backends = [ filters.CustomSearchFilterBackend, FilteringFilterBackend, + CompoundSearchFilterBackend, + FacetedSearchFilterBackend, ] + faceted_search_fields = { + 'works_at_weekday': { + 'field': 'works_at_weekday', + 'facet': TermsFacet, + 'enabled': True, + }, + 'state': { + 'field': 'state', + 'facet': TermsFacet, + 'enabled': True, + } + } + search_fields = { 'title': {'fuzziness': 'auto:2,5', 'boost': 3}, @@ -69,8 +86,7 @@ class EstablishmentDocumentViewSet(BaseDocumentViewSet): """Establishment document ViewSet.""" document = EstablishmentDocument - lookup_field = 'slug' - pagination_class = ProjectMobilePagination + pagination_class = ESDocumentPagination permission_classes = (permissions.AllowAny,) serializer_class = serializers.EstablishmentDocumentSerializer @@ -83,9 +99,42 @@ class EstablishmentDocumentViewSet(BaseDocumentViewSet): FilteringFilterBackend, filters.CustomSearchFilterBackend, GeoSpatialFilteringFilterBackend, - # DefaultOrderingFilterBackend, + FacetedSearchFilterBackend, ] + faceted_search_fields = { + 'works_at_weekday': { + 'field': 'works_at_weekday', + 'facet': TermsFacet, + 'enabled': True, + }, + 'toque_number': { + 'field': 'toque_number', + 'enabled': True, + 'facet': TermsFacet, + }, + 'works_at_noon': { + 'field': 'works_at_noon', + 'facet': TermsFacet, + 'enabled': True, + }, + 'works_evening': { + 'field': 'works_evening', + 'facet': TermsFacet, + 'enabled': True, + }, + 'works_now': { + 'field': 'works_now', + 'facet': TermsFacet, + 'enabled': True, + }, + 'tag': { + 'field': 'tags.index_name', + 'facet': TermsFacet, + 'enabled': True, + } + } + search_fields = { 'name': {'fuzziness': 'auto:2,5', 'boost': 4}, @@ -211,13 +260,15 @@ class ProductDocumentViewSet(BaseDocumentViewSet): """Product document ViewSet.""" document = ProductDocument - pagination_class = ProjectMobilePagination + pagination_class = ESDocumentPagination permission_classes = (permissions.AllowAny,) serializer_class = serializers.ProductDocumentSerializer filter_backends = [ FilteringFilterBackend, filters.CustomSearchFilterBackend, + CompoundSearchFilterBackend, + FacetedSearchFilterBackend, ] search_fields = { diff --git a/apps/utils/pagination.py b/apps/utils/pagination.py index ac83f4f2..89f16148 100644 --- a/apps/utils/pagination.py +++ b/apps/utils/pagination.py @@ -3,7 +3,8 @@ from base64 import b64encode from urllib import parse as urlparse from django.conf import settings -from rest_framework.pagination import PageNumberPagination, CursorPagination +from rest_framework.pagination import CursorPagination +from django_elasticsearch_dsl_drf.pagination import PageNumberPagination class ProjectPageNumberPagination(PageNumberPagination): @@ -48,6 +49,23 @@ class ProjectMobilePagination(ProjectPageNumberPagination): return self.page.previous_page_number() +class ESDocumentPagination(PageNumberPagination): + """Pagination class for ES results. (includes facets)""" + page_size_query_param = 'page_size' + + def get_next_link(self): + """Get next link method.""" + if not self.page.has_next(): + return None + return self.page.next_page_number() + + def get_previous_link(self): + """Get previous link method.""" + if not self.page.has_previous(): + return None + return self.page.previous_page_number() + + class EstablishmentPortionPagination(ProjectMobilePagination): """ Pagination for app establishments with limit page size equal to 12