Show exact match first!

This commit is contained in:
2026-01-19 21:20:39 +11:00
parent 3d5c95f46f
commit fb4bb6a16d
+11 -2
View File
@@ -3,7 +3,7 @@ from itertools import chain
from django.http import JsonResponse
from django.views.generic import ListView
from django.views.generic.base import TemplateView
from django.db.models import Q, Value, CharField
from django.db.models import Q, Value, CharField, IntegerField, Case, When
from django.db import models
from django.utils.text import slugify
from .models import Link, Page, Post
@@ -244,7 +244,16 @@ def search_api_v2(request):
def search_aliases(request):
query = request.GET.get('q', '').strip()
links = Link.objects.filter(alias__icontains=query)[:10]
# Prioritize results: exact match first, then starts with, then contains
links = Link.objects.filter(alias__icontains=query).annotate(
priority=Case(
When(alias__iexact=query, then=Value(1)),
When(alias__istartswith=query, then=Value(2)),
default=Value(3),
output_field=IntegerField()
)
).order_by('priority', 'alias')[:10]
results = []
for link in links: