Order within bounding box from center

This commit is contained in:
Kuroshini 2019-11-29 14:37:10 +03:00
parent 1a57d0edd8
commit 376f815c97
2 changed files with 30 additions and 3 deletions

View File

@ -1,10 +1,31 @@
"""Search indexes filters."""
from elasticsearch_dsl.query import Q
from django_elasticsearch_dsl_drf.filter_backends import SearchFilterBackend, FacetedSearchFilterBackend
from django_elasticsearch_dsl_drf.filter_backends import SearchFilterBackend, \
FacetedSearchFilterBackend, GeoSpatialFilteringFilterBackend
from search_indexes.utils import OBJECT_FIELD_PROPERTIES
from six import iteritems
class CustomGeoSpatialFilteringFilterBackend(GeoSpatialFilteringFilterBackend):
"""Automatically adds centering and sorting within bounding box."""
@staticmethod
def calculate_center(a, b):
return (a[0] + b[0]) / 2, (a[1] + b[1]) / 2
def filter_queryset(self, request, queryset, view):
ret = super().filter_queryset(request, queryset, view)
bb = request.query_params.get('location__geo_bounding_box')
if bb:
center = self.calculate_center(*map(lambda p: list(map(lambda x: float(x),p.split(','))), bb.split('__')))
request.GET._mutable = True
request.query_params.update({
'ordering': f'location__{center[0]}__{center[1]}__km'
})
request.GET._mutable = False
return ret
class CustomFacetedSearchFilterBackend(FacetedSearchFilterBackend):
def __init__(self):

View File

@ -103,7 +103,7 @@ class EstablishmentDocumentViewSet(BaseDocumentViewSet):
filter_backends = [
FilteringFilterBackend,
filters.CustomSearchFilterBackend,
GeoSpatialFilteringFilterBackend,
filters.CustomGeoSpatialFilteringFilterBackend,
filters.CustomFacetedSearchFilterBackend,
GeoSpatialOrderingFilterBackend,
]
@ -287,6 +287,12 @@ class EstablishmentDocumentViewSet(BaseDocumentViewSet):
}
}
geo_spatial_ordering_fields = {
'location': {
'field': 'address.coordinates',
},
}
class MobileEstablishmentDocumentViewSet(EstablishmentDocumentViewSet):
@ -309,7 +315,7 @@ class ProductDocumentViewSet(BaseDocumentViewSet):
FilteringFilterBackend,
filters.CustomSearchFilterBackend,
filters.CustomFacetedSearchFilterBackend,
GeoSpatialOrderingFilterBackend,
# GeoSpatialOrderingFilterBackend,
]
search_fields = {