|
20 | 20 | from django.utils.decorators import method_decorator |
21 | 21 | from django.views.decorators.cache import cache_page |
22 | 22 | 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 |
24 | 24 |
|
25 | 25 | from rest_framework.views import APIView |
26 | 26 | from rest_framework.response import Response |
@@ -462,7 +462,7 @@ class SearchResultsList(APIView): |
462 | 462 | Sorted by recency. |
463 | 463 | """ |
464 | 464 |
|
465 | | - # @method_decorator(cache_page(60 * 60 * 2)) |
| 465 | + @method_decorator(cache_page(60 * 60 * 1)) |
466 | 466 | def get(self, request) -> JsonResponse: |
467 | 467 | filters, window_size, query, _ = handle_search_params(request) |
468 | 468 |
|
@@ -491,10 +491,19 @@ def get(self, request) -> JsonResponse: |
491 | 491 | max_words=window_size, |
492 | 492 | config="english", |
493 | 493 | ) |
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") |
496 | 505 |
|
497 | | - queryset = queryset.order_by("-sitting__date").values(*query_values) |
| 506 | + queryset = queryset.values(*query_values) |
498 | 507 | if not queryset: |
499 | 508 | return HttpResponseNotFound("No speeches found with the given query.") |
500 | 509 |
|
@@ -523,6 +532,7 @@ def get(self, request) -> JsonResponse: |
523 | 532 | if query |
524 | 533 | else speech["speech"][:window_size] + "..." |
525 | 534 | ), |
| 535 | + "relevance_score": speech.get("rank", 0) if query else None, |
526 | 536 | "sitting": { |
527 | 537 | "date": speech["sitting__date"], |
528 | 538 | "term": speech["sitting__cycle__term"], |
|
0 commit comments