You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

40 lines
1.9 KiB

from django.db import models
from rest_framework import serializers
class SearchEntityType(models.TextChoices):
INSTITUTION = 'institution', 'Institution'
PROJECT = 'project', 'Project'
COURSE = 'course', 'Course'
POST = 'post', 'Post'
EVENT = 'event', 'Event'
class SearchResultItemSerializer(serializers.Serializer):
id = serializers.CharField(help_text="Entity unique identifier")
type = serializers.ChoiceField(
choices=SearchEntityType.choices,
help_text="Type of the entity found"
)
title = serializers.CharField(help_text="Title or primary name")
description = serializers.CharField(allow_blank=True, required=False, help_text="Summary or excerpt")
url_path = serializers.CharField(help_text="Frontend navigation route")
image = serializers.CharField(allow_null=True, required=False, help_text="Cover or avatar image URL")
badge = serializers.CharField(allow_blank=True, required=False, help_text="Contextual badge / label")
metadata = serializers.DictField(required=False, help_text="Additional metadata attributes")
relevance_score = serializers.FloatField(required=False, default=1.0, help_text="Relevance ranking score")
class SearchTypeCountSerializer(serializers.Serializer):
institutions = serializers.IntegerField(default=0)
projects = serializers.IntegerField(default=0)
courses = serializers.IntegerField(default=0)
posts = serializers.IntegerField(default=0)
events = serializers.IntegerField(default=0)
class UnifiedSearchResponseSerializer(serializers.Serializer):
query = serializers.CharField(help_text="Original search query string")
total_results = serializers.IntegerField(help_text="Total number of matched records across categories")
by_type = SearchTypeCountSerializer(help_text="Breakdown count of matched records by entity type")
results = SearchResultItemSerializer(many=True, help_text="List of matched search results ordered by relevance")