.card-meta display: flex; gap: 15px; margin-bottom: 15px; font-size: 13px; color: #888;
router.get('/api/media-types', async (req, res) => try const mediaTypes = await searchService.getMediaTypes(); res.json(mediaTypes); catch (error) res.status(500).json( error: error.message );
// Content-based filtering const contentFeatures = await this.extractFeatures(contentId); // Hybrid recommendation const recommendations = await this.hybridRecommendation( similarUsers, userHistory, contentFeatures ); return recommendations;
module.exports = router; // SearchInterface.jsx import React, useState, useEffect from 'react'; import './SearchInterface.css'; const SearchInterface = () => const [searchQuery, setSearchQuery] = useState(''); const [selectedCategory, setSelectedCategory] = useState(''); const [selectedMediaType, setSelectedMediaType] = useState(''); const [filters, setFilters] = useState( minRating: 0, maxRating: 10, dateRange: start: '', end: '' , sortBy: 'relevance' ); const [results, setResults] = useState([]); const [categories, setCategories] = useState([]); const [mediaTypes, setMediaTypes] = useState([]); const [loading, setLoading] = useState(false); const [pagination, setPagination] = useState( page: 1, totalPages: 1 );
.card-title margin: 0 0 10px 0; font-size: 18px; font-weight: 600;
.rating-slider display: flex; flex-direction: column; gap: 15px;
<div className="results-grid"> results.map(item => ( <ContentCard key=item.id item=item /> )) </div>
.view-details-btn:hover background: #007bff; color: white; border-color: #007bff;
const offset = (page - 1) * limit; let sql = ` SELECT ci.*, c.name as category_name, c.type as category_type, MATCH(ci.title, ci.description) AGAINST(? IN BOOLEAN MODE) as relevance FROM content_items ci JOIN categories c ON ci.category_id = c.id WHERE 1=1 `; const params = [query + '*']; // For boolean full-text search // Add filters if (categoryId) // Include subcategories sql += ` AND ci.category_id IN ( WITH RECURSIVE category_tree AS ( SELECT id FROM categories WHERE id = ? UNION ALL SELECT c.id FROM categories c INNER JOIN category_tree ct ON c.parent_id = ct.id ) SELECT id FROM category_tree )`; params.push(categoryId); if (mediaType) sql += ` AND ci.media_type = ?`; params.push(mediaType); if (minRating > 0) sql += ` AND ci.rating >= ?`; params.push(minRating); if (maxRating < 10) sql += ` AND ci.rating <= ?`; params.push(maxRating); if (startDate) sql += ` AND ci.release_date >= ?`; params.push(startDate); if (endDate) sql += ` AND ci.release_date <= ?`; params.push(endDate); // Add sorting if (sortBy === 'relevance' && query) sql += ` ORDER BY relevance $sortOrder`; else if (sortBy === 'rating') sql += ` ORDER BY ci.rating $sortOrder`; else if (sortBy === 'date') sql += ` ORDER BY ci.release_date $sortOrder`; else if (sortBy === 'title') sql += ` ORDER BY ci.title $sortOrder`; // Add pagination sql += ` LIMIT ? OFFSET ?`; params.push(limit, offset); // Get total count let countSql = ` SELECT COUNT(*) as total FROM content_items ci JOIN categories c ON ci.category_id = c.id WHERE 1=1 `; // Apply same filters to count query (simplified for brevity) const [results, total] = await Promise.all([ db.query(sql, params), db.query(countSql, countParams) ]); return items: results, pagination: page, limit, total: total[0].total, totalPages: Math.ceil(total[0].total / limit) , filters: categoryId, mediaType, minRating, maxRating ;
/* Pagination */ pagination.totalPages > 1 && ( <div className="pagination"> <button onClick=() => setPagination(prev => ( ...prev, page: prev.page - 1 )) disabled=pagination.page === 1 > Previous </button> <span>Page pagination.page of pagination.totalPages</span> <button onClick=() => setPagination(prev => ( ...prev, page: prev.page + 1 )) disabled=pagination.page === pagination.totalPages > Next </button> </div> ) </> ) </main> </div> </div> ); ;
// Advanced search with Elasticsearch class ElasticSearchService constructor() const Client = require('@elastic/elasticsearch'); this.client = new Client( node: 'http://localhost:9200' ); async indexContent(content) return await this.client.index( index: 'entertainment_content', id: content.id, body: title: content.title, description: content.description, category: content.category_name, media_type: content.media_type, rating: content.rating, release_date: content.release_date, suggestions: );

