Ohne den Klassencode ist es schwierig, den besseren Weg zur Optimierung Ihrer Abfrage zu finden.
Sie können einen Gin hinzufügen oder Gist Index, um die Ähnlichkeit der Trigramme zu beschleunigen.
Sie können eine Anmerkung mit dem SearchVector erstellen wie unten:
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)
)
Sie können die Volltextsuche mit beschleunigen SearchVectorField
Um mehr über Volltextsuche und Trigramme zu erfahren, können Sie den Artikel lesen, den ich zu diesem Thema geschrieben habe:
"Volltextsuche in Django mit PostgreSQL"