ES Facets in addition to results

This commit is contained in:
Kuroshini 2019-11-21 21:59:24 +03:00
parent 04d6412f39
commit e6b353e864
3 changed files with 78 additions and 8 deletions

View File

@ -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(

View File

@ -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 = {

View File

@ -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