from django.shortcuts import render from elasticsearch_dsl import Q from .documents import DiarioOficialDocument def search_diarios(request): q = request.GET.get('q', '') page = int(request.GET.get('page', 1)) size = int(request.GET.get('size', 10)) start = (page - 1) * size end = start + size results = [] total = 0 if q: # Busca principal com boost para relevância query = Q( 'multi_match', query=q, fields=['content^3', 'tipo.nome^2', 'numero', 'pages.content'], fuzziness='AUTO' ) # Pesquisa com highlighting search = DiarioOficialDocument.search() search = search.query(query) search = search.highlight('content', fragment_size=150, number_of_fragments=3) search = search.highlight('pages.content', fragment_size=150, number_of_fragments=3) # Paginação search = search[start:end] response = search.execute() total = response.hits.total.value for hit in response: # Adicionar destaque highlight = "" if hasattr(hit.meta, 'highlight'): if 'content' in hit.meta.highlight: highlight = "...".join(hit.meta.highlight.content) # Processando páginas com destaque highlighted_pages = [] if hasattr(hit.meta, 'highlight') and 'pages.content' in hit.meta.highlight: for i, content in enumerate(hit.meta.highlight['pages.content']): # Encontre a página correspondente page_number = i + 1 # Lógica simplificada, pode precisar de ajuste highlighted_pages.append({ 'number': page_number, 'content': content }) # Combine dados do documento com os destaques result = { 'id': hit.id, 'tipo': hit.tipo.nome if hasattr(hit, 'tipo') and hit.tipo else '', 'numero': hit.numero, 'data': hit.data, 'link': hit.link, 'highlight': highlight, 'highlighted_pages': highlighted_pages } results.append(result) context = { 'query': q, 'results': results, 'total': total, 'page': page, 'size': size, 'total_pages': (total + size - 1) // size if total > 0 else 0, } return render(request, 'diarios/diarios_search.html', context) def diario_detail(request, pk): diario = get_object_or_404(Diario, pk=pk) return render(request, 'diarios/diario_detail.html', {'diario': diario})