84 lines
2.8 KiB
Python
84 lines
2.8 KiB
Python
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})
|
|
|