From 4551d6ac0b6922b61bd1778f9a9f197de490a40d Mon Sep 17 00:00:00 2001 From: Santos Gallegos Date: Thu, 6 Nov 2025 19:53:36 -0500 Subject: [PATCH 1/2] Search: don't sort inner hits --- readthedocs/search/api/v2/serializers.py | 51 ++++++++++-------------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/readthedocs/search/api/v2/serializers.py b/readthedocs/search/api/v2/serializers.py index 5c09756e406..70f21fefe61 100644 --- a/readthedocs/search/api/v2/serializers.py +++ b/readthedocs/search/api/v2/serializers.py @@ -55,6 +55,25 @@ def get_title(self, obj): return list(getattr(obj, "title", [])) +class SectionHighlightSerializer(serializers.Serializer): + title = serializers.SerializerMethodField() + content = serializers.SerializerMethodField() + + def get_title(self, obj): + return list(getattr(obj, "sections.title", [])) + + def get_content(self, obj): + return list(getattr(obj, "sections.content", [])) + + +class SectionSearchSerializer(serializers.Serializer): + type = serializers.CharField(default="section", source=None, read_only=True) + id = serializers.CharField() + title = serializers.CharField() + content = serializers.CharField() + highlights = SectionHighlightSerializer(source="meta.highlight", default=dict) + + class PageSearchSerializer(serializers.Serializer): """ Page serializer. @@ -74,7 +93,7 @@ class PageSearchSerializer(serializers.Serializer): path = serializers.SerializerMethodField() domain = serializers.SerializerMethodField() highlights = PageHighlightSerializer(source="meta.highlight", default=dict) - blocks = serializers.SerializerMethodField() + blocks = SectionSearchSerializer(source="meta.inner_hits.sections", many=True, default=list) def __init__(self, *args, projects=None, **kwargs): if projects: @@ -152,33 +171,3 @@ def _get_full_path(self, obj): return docs_url.rstrip("/") + "/" + path.lstrip("/") return None - - def get_blocks(self, obj): - """Combine and sort inner results (domains and sections).""" - sections = obj.meta.inner_hits.sections or [] - sorted_results = sorted( - sections, - key=attrgetter("meta.score"), - reverse=True, - ) - sorted_results = [SectionSearchSerializer(hit).data for hit in sorted_results] - return sorted_results - - -class SectionHighlightSerializer(serializers.Serializer): - title = serializers.SerializerMethodField() - content = serializers.SerializerMethodField() - - def get_title(self, obj): - return list(getattr(obj, "sections.title", [])) - - def get_content(self, obj): - return list(getattr(obj, "sections.content", [])) - - -class SectionSearchSerializer(serializers.Serializer): - type = serializers.CharField(default="section", source=None, read_only=True) - id = serializers.CharField() - title = serializers.CharField() - content = serializers.CharField() - highlights = SectionHighlightSerializer(source="meta.highlight", default=dict) From e05768bcb9f8ac7a208850805e8ad50f28fa8e8d Mon Sep 17 00:00:00 2001 From: Santos Gallegos Date: Thu, 6 Nov 2025 20:00:08 -0500 Subject: [PATCH 2/2] Format --- readthedocs/search/api/v2/serializers.py | 1 - 1 file changed, 1 deletion(-) diff --git a/readthedocs/search/api/v2/serializers.py b/readthedocs/search/api/v2/serializers.py index 70f21fefe61..06f2a99c3c6 100644 --- a/readthedocs/search/api/v2/serializers.py +++ b/readthedocs/search/api/v2/serializers.py @@ -8,7 +8,6 @@ import re from functools import namedtuple -from operator import attrgetter from urllib.parse import urlparse from rest_framework import serializers