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."""