Show short entries first in search results to improve UX
This commit is contained in:
parent
567884b741
commit
89f6e3656b
|
@ -9,7 +9,7 @@ from urllib.parse import parse_qs, urlencode, urlsplit, urlunsplit
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django import urls
|
from django import urls
|
||||||
from django.db import transaction
|
from django.db import models, transaction
|
||||||
|
|
||||||
|
|
||||||
def rename_file(instance, field_name, new_name, allow_missing_file=False):
|
def rename_file(instance, field_name, new_name, allow_missing_file=False):
|
||||||
|
@ -139,3 +139,11 @@ def parse_meta(html):
|
||||||
meta = [elem for elem in tree.iter() if elem.tag in ["meta", "link"]]
|
meta = [elem for elem in tree.iter() if elem.tag in ["meta", "link"]]
|
||||||
|
|
||||||
return [dict([("tag", elem.tag)] + list(elem.items())) for elem in meta]
|
return [dict([("tag", elem.tag)] + list(elem.items())) for elem in meta]
|
||||||
|
|
||||||
|
|
||||||
|
def order_for_search(qs, field):
|
||||||
|
"""
|
||||||
|
When searching, it's often more useful to have short results first,
|
||||||
|
this function will order the given qs based on the length of the given field
|
||||||
|
"""
|
||||||
|
return qs.annotate(__size=models.functions.Length(field)).order_by("__size")
|
||||||
|
|
|
@ -448,28 +448,29 @@ class Search(views.APIView):
|
||||||
"artist__name__unaccent",
|
"artist__name__unaccent",
|
||||||
]
|
]
|
||||||
query_obj = utils.get_query(query, search_fields)
|
query_obj = utils.get_query(query, search_fields)
|
||||||
return (
|
qs = (
|
||||||
models.Track.objects.all()
|
models.Track.objects.all()
|
||||||
.filter(query_obj)
|
.filter(query_obj)
|
||||||
.select_related("artist", "album__artist")
|
.select_related("artist", "album__artist")
|
||||||
)[: self.max_results]
|
)
|
||||||
|
return common_utils.order_for_search(qs, "title")[: self.max_results]
|
||||||
|
|
||||||
def get_albums(self, query):
|
def get_albums(self, query):
|
||||||
search_fields = ["mbid", "title__unaccent", "artist__name__unaccent"]
|
search_fields = ["mbid", "title__unaccent", "artist__name__unaccent"]
|
||||||
query_obj = utils.get_query(query, search_fields)
|
query_obj = utils.get_query(query, search_fields)
|
||||||
return (
|
qs = (
|
||||||
models.Album.objects.all()
|
models.Album.objects.all()
|
||||||
.filter(query_obj)
|
.filter(query_obj)
|
||||||
.select_related()
|
.select_related()
|
||||||
.prefetch_related("tracks")
|
.prefetch_related("tracks__artist")
|
||||||
)[: self.max_results]
|
)
|
||||||
|
return common_utils.order_for_search(qs, "title")[: self.max_results]
|
||||||
|
|
||||||
def get_artists(self, query):
|
def get_artists(self, query):
|
||||||
search_fields = ["mbid", "name__unaccent"]
|
search_fields = ["mbid", "name__unaccent"]
|
||||||
query_obj = utils.get_query(query, search_fields)
|
query_obj = utils.get_query(query, search_fields)
|
||||||
return (models.Artist.objects.all().filter(query_obj).with_albums())[
|
qs = models.Artist.objects.all().filter(query_obj).with_albums()
|
||||||
: self.max_results
|
return common_utils.order_for_search(qs, "name")[: self.max_results]
|
||||||
]
|
|
||||||
|
|
||||||
def get_tags(self, query):
|
def get_tags(self, query):
|
||||||
search_fields = ["slug", "name__unaccent"]
|
search_fields = ["slug", "name__unaccent"]
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Show short entries first in search results to improve UX
|
Loading…
Reference in New Issue