Sans le code de classe, il est difficile de trouver le meilleur moyen d'optimiser votre requête.
Vous pouvez ajouter un Gin ou Gist index pour accélérer la similarité des trigrammes.
Vous pouvez construire une annotation avec le SearchVector comme ci-dessous :
from django.contrib.postgres.aggregates import StringAgg
from django.contrib.postgres.search import SearchQuery, SearchVector
search_vectors = (
SearchVector('vision_expertise') +
SearchVector('bio_description') +
SearchVector(StringAgg('experiences__description', delimiter=' ')) +
SearchVector(StringAgg('educations__description', delimiter=' ')) +
SearchVector(StringAgg('publications__description', delimiter=' '))
)
Profile.objects.annotate(
search=search_vectors
).filter(
Q(search=SearchQuery(search_term)) |
Q(first_name__trigram_similar=search_term) |
Q(last_name__trigram_similar=search_term) |
Q(educations__degree__trigram_similar=search_term) |
Q(educations__field_of_study__trigram_similar=search_term) |
Q(educations__school__trigram_similar=search_term) |
Q(experiences__title__trigram_similar=search_term) |
Q(experiences__company__trigram_similar=search_term) |
Q(publications__title__trigram_similar=search_term) |
Q(certification__certification_name__trigram_similar=search_term) |
Q(certification__certification_authority__trigram_similar=search_term)
)
Vous pouvez accélérer la recherche plein texte en utilisant un RechercherChampVecteur
Pour en savoir plus sur la recherche plein texte et le trigramme vous pouvez lire l'article que j'ai écrit sur le sujet :
"Recherche en texte intégral dans Django avec PostgreSQL"