From d81d2445f5fefa37dfffc66a45331f15ff153387 Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Wed, 22 Jan 2020 21:47:21 +0300 Subject: [PATCH] tune news search for BO --- apps/news/filters.py | 2 +- apps/news/models.py | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/apps/news/filters.py b/apps/news/filters.py index 3385c537..064f7175 100644 --- a/apps/news/filters.py +++ b/apps/news/filters.py @@ -51,7 +51,7 @@ class NewsListFilterSet(filters.FilterSet): if value not in EMPTY_VALUES: if len(value) < 3: raise ValidationError({'detail': _('Type at least 3 characters to search please.')}) - return queryset.es_search(value) + return queryset.es_search(value, relevance_order='ordering' not in self.request.query_params) return queryset def in_tags(self, queryset, name, value): diff --git a/apps/news/models.py b/apps/news/models.py index fed4da82..89dacf5a 100644 --- a/apps/news/models.py +++ b/apps/news/models.py @@ -160,7 +160,7 @@ class NewsQuerySet(TranslationQuerysetMixin): def by_locale(self, locale): return self.filter(title__icontains=locale) - def es_search(self, search_value: str): + def es_search(self, search_value: str, relevance_order=True): from search_indexes.documents import NewsDocument from search_indexes.utils import OBJECT_FIELD_PROPERTIES search_value = search_value.lower() @@ -186,9 +186,12 @@ class NewsQuerySet(TranslationQuerysetMixin): _query |= elasticsearch_dsl.Q('wildcard', **{key: {'value': f'*{search_value}*', 'boost': boost + 30}}) search = NewsDocument.search().query('bool', should=_query)[0:10000].execute() ids = [result.meta.id for result in search] - ids_order = enumerate(ids) - preserved = Case(*[When(pk=pk, then=pos) for pos, pk in ids_order]) - return self.filter(id__in=ids).order_by(preserved) + qs = self.filter(id__in=ids) + if relevance_order: + ids_order = enumerate(ids) + preserved = Case(*[When(pk=pk, then=pos) for pos, pk in ids_order]) + qs = qs.order_by(preserved) + return qs def trigram_search(self, search_value: str): """Search with mistakes by description or title or subtitle."""