PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Performances médiocres lorsque la similarité des trigrammes et la recherche en texte intégral étaient combinées avec Q ind django à l'aide de postgres

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"