From e67d7767a1748b7933eba3047c5fe664b5e28859 Mon Sep 17 00:00:00 2001 From: evgeniy-st Date: Tue, 17 Sep 2019 17:33:07 +0300 Subject: [PATCH] Elasticsearch: establishment address. Filter by country_id, country_code --- apps/location/models.py | 5 ++++ .../search_indexes/documents/establishment.py | 28 +++++++++++++++++++ apps/search_indexes/serializers.py | 2 ++ apps/search_indexes/utils.py | 1 + apps/search_indexes/views.py | 6 ++++ apps/utils/models.py | 20 +++++++++++++ 6 files changed, 62 insertions(+) diff --git a/apps/location/models.py b/apps/location/models.py index 7d7cd8a2..7084385f 100644 --- a/apps/location/models.py +++ b/apps/location/models.py @@ -104,6 +104,11 @@ class Address(models.Model): def longitude(self): return self.coordinates.x + @property + def location_field_indexing(self): + return {'lat': self.latitude, + 'lon': self.longitude} + # todo: Make recalculate price levels @receiver(post_save, sender=Country) diff --git a/apps/search_indexes/documents/establishment.py b/apps/search_indexes/documents/establishment.py index a12e23c8..a260c7f5 100644 --- a/apps/search_indexes/documents/establishment.py +++ b/apps/search_indexes/documents/establishment.py @@ -21,6 +21,34 @@ class EstablishmentDocument(Document): 'label': fields.ObjectField(attr='label') }, multi=True) + address = fields.ObjectField( + properties={ + 'id': fields.IntegerField(), + 'street_name_1': fields.TextField( + fields={'raw': fields.KeywordField()} + ), + 'street_name_2': fields.TextField( + fields={'raw': fields.KeywordField()} + ), + 'number': fields.IntegerField(), + 'location': fields.GeoPointField(attr='location_field_indexing'), + 'city': fields.ObjectField( + properties={ + 'id': fields.IntegerField(), + 'name': fields.KeywordField(), + 'is_island': fields.BooleanField(), + 'country': fields.ObjectField( + properties={ + 'id': fields.IntegerField(), + 'name': fields.ObjectField(attr='name_indexing', + properties=OBJECT_FIELD_PROPERTIES), + 'code': fields.KeywordField(), + } + ), + } + ), + } + ) class Django: diff --git a/apps/search_indexes/serializers.py b/apps/search_indexes/serializers.py index f4c27c9b..ed8b65eb 100644 --- a/apps/search_indexes/serializers.py +++ b/apps/search_indexes/serializers.py @@ -40,6 +40,7 @@ class NewsDocumentSerializer(DocumentSerializer): return get_translated_value(obj.description) +# todo: country_name_translated class EstablishmentDocumentSerializer(DocumentSerializer): """Establishment document serializer.""" @@ -58,6 +59,7 @@ class EstablishmentDocumentSerializer(DocumentSerializer): 'price_level', 'description_translated', 'tags', + 'address', ) @staticmethod diff --git a/apps/search_indexes/utils.py b/apps/search_indexes/utils.py index a3cfac87..93be9e81 100644 --- a/apps/search_indexes/utils.py +++ b/apps/search_indexes/utils.py @@ -7,6 +7,7 @@ from utils.models import get_current_language OBJECT_FIELD_PROPERTIES = { 'en-GB': fields.TextField(analyzer='english'), 'ru-RU': fields.TextField(analyzer='russian'), + 'fr-FR': fields.TextField(analyzer='french'), } diff --git a/apps/search_indexes/views.py b/apps/search_indexes/views.py index 5dbaf8fd..9f7164d0 100644 --- a/apps/search_indexes/views.py +++ b/apps/search_indexes/views.py @@ -78,4 +78,10 @@ class EstablishmentDocumentViewSet(BaseDocumentViewSet): constants.LOOKUP_QUERY_LTE, ] }, + 'country_id': { + 'field': 'address.city.country.id' + }, + 'country': { + 'field': 'address.city.country.code' + } } diff --git a/apps/utils/models.py b/apps/utils/models.py index 22a7de98..92db5c47 100644 --- a/apps/utils/models.py +++ b/apps/utils/models.py @@ -55,6 +55,24 @@ def translate_field(self, field_name): return translate +# todo: refactor this +class IndexJSON: + + def __getattr__(self, item): + return None + + +def index_field(self, field_name): + def index(self): + field = getattr(self, field_name) + obj = IndexJSON() + if isinstance(field, dict): + for key, value in field.items(): + setattr(obj, key, value) + return obj + return index + + class TranslatedFieldsMixin: """Translated Fields mixin""" @@ -69,6 +87,8 @@ class TranslatedFieldsMixin: if isinstance(field, TJSONField): setattr(cls, f'{field.name}_translated', property(translate_field(self, field_name))) + setattr(cls, f'{field_name}_indexing', + property(index_field(self, field_name))) def __str__(self): """Overrided __str__ method."""