tune news search for BO

This commit is contained in:
Kuroshini 2020-01-22 21:47:21 +03:00
parent 1c01604f43
commit d81d2445f5
2 changed files with 8 additions and 5 deletions

View File

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

View File

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