from django_elasticsearch_dsl import Document, fields from django_elasticsearch_dsl.registries import registry from .models import DiarioOficial @registry.register_document class DiarioOficialDocument(Document): tipo = fields.ObjectField(properties={ 'nome': fields.TextField() }) numero = fields.TextField() data = fields.DateField() link = fields.TextField() # Campo para armazenar todas as páginas para busca content = fields.TextField( analyzer='pt_analyzer', ) # Campo para armazenar páginas individualmente pages = fields.NestedField(properties={ 'number': fields.IntegerField(), 'content': fields.TextField( analyzer='pt_analyzer', ) }) class Index: name = 'diarios_oficiais' settings = { 'number_of_shards': 1, 'number_of_replicas': 0, 'analysis': { 'filter': { 'portuguese_stop': { 'type': 'stop', 'stopwords': '_portuguese_' }, 'portuguese_stemmer': { 'type': 'stemmer', 'language': 'portuguese' }, 'synonym_filter': { 'type': 'synonym', 'synonyms': [ 'lei, legislação, norma', 'processo, procedimento, autos', 'contrato, acordo, convênio', # Adicione mais sinônimos relevantes para o contexto legal ] } }, 'analyzer': { 'pt_analyzer': { 'tokenizer': 'standard', 'filter': [ 'lowercase', 'portuguese_stop', 'portuguese_stemmer', 'synonym_filter' ] } } } } class Django: model = DiarioOficial fields = [ 'id' ] def prepare_tipo(self, instance): if instance.tipo: return { 'nome': instance.tipo.nome } return {} def prepare_content(self, instance): """Concatena todo o conteúdo de todas as páginas em um único campo para busca""" if instance.page_content: return " ".join([page.get('content', '') for page in instance.page_content]) return "" def prepare_pages(self, instance): """Prepara o campo de páginas individuais para exibição e destaque""" if instance.page_content: return instance.page_content return []