Skip to content

Commit 4ada70b

Browse files
authored
Merge pull request #5 from govtechmy/feat/search-relevancy
feat: enhance search functionality by adding relevance ranking and ad…
2 parents db538fb + 3133c91 commit 4ada70b

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

src/api/views.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from django.utils.decorators import method_decorator
2121
from django.views.decorators.cache import cache_page
2222
from django.core.paginator import Paginator, EmptyPage
23-
from django.contrib.postgres.search import SearchHeadline, SearchQuery
23+
from django.contrib.postgres.search import SearchHeadline, SearchQuery, SearchRank
2424

2525
from rest_framework.views import APIView
2626
from rest_framework.response import Response
@@ -462,7 +462,7 @@ class SearchResultsList(APIView):
462462
Sorted by recency.
463463
"""
464464

465-
# @method_decorator(cache_page(60 * 60 * 2))
465+
@method_decorator(cache_page(60 * 60 * 1))
466466
def get(self, request) -> JsonResponse:
467467
filters, window_size, query, _ = handle_search_params(request)
468468

@@ -491,10 +491,19 @@ def get(self, request) -> JsonResponse:
491491
max_words=window_size,
492492
config="english",
493493
)
494-
queryset = queryset.annotate(headline=search_headline)
495-
query_values += ["headline"]
494+
# Add search ranking for relevance-based ordering
495+
search_query = SearchQuery(query, config="english")
496+
search_rank = SearchRank(F("speech_vector"), search_query)
497+
498+
queryset = queryset.annotate(headline=search_headline, rank=search_rank)
499+
query_values += ["headline", "rank"]
500+
# Order by relevance (rank) first, then by recency as secondary sort
501+
queryset = queryset.order_by("-rank", "-sitting__date")
502+
else:
503+
# For non-search queries, still order by recency
504+
queryset = queryset.order_by("-sitting__date")
496505

497-
queryset = queryset.order_by("-sitting__date").values(*query_values)
506+
queryset = queryset.values(*query_values)
498507
if not queryset:
499508
return HttpResponseNotFound("No speeches found with the given query.")
500509

@@ -523,6 +532,7 @@ def get(self, request) -> JsonResponse:
523532
if query
524533
else speech["speech"][:window_size] + "..."
525534
),
535+
"relevance_score": speech.get("rank", 0) if query else None,
526536
"sitting": {
527537
"date": speech["sitting__date"],
528538
"term": speech["sitting__cycle__term"],

0 commit comments

Comments
 (0)