Merge pull request #95 from gpodder/dependabot/pip/python-dateutil-2.7.2
[mygpo.git] / mygpo / search / index.py
blob555ab1153f0990f76defe62f03b6c008291c10b6
2 """ Contains code for searching podcasts
4 Uses django.contrib.postgres.search for searching. See docs at
5 https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/search/
7 """
9 from django.conf import settings
11 from mygpo.podcasts.models import Podcast
13 from django.db.models import F, FloatField, ExpressionWrapper
14 from django.contrib.postgres.search import SearchQuery, SearchRank
15 from django.conf import settings
17 import logging
18 logger = logging.getLogger(__name__)
21 SEARCH_CUTOFF = settings.SEARCH_CUTOFF
24 def search_podcasts(query):
25 """ Search for podcasts according to 'query' """
27 logger.debug('Searching for "{query}" podcasts"', query=query)
29 query = SearchQuery(query)
31 results = Podcast.objects\
32 .annotate(
33 rank=SearchRank(F('search_vector'), query)
35 .annotate(
36 order=ExpressionWrapper(
37 F('rank') * F('subscribers'),
38 output_field=FloatField())
40 .filter(rank__gte=SEARCH_CUTOFF)\
41 .order_by('-order')
43 logger.debug('Found {count} podcasts for "{query}"', count=len(results),
44 query=query)
46 return results