PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Schlechte Leistung, wenn Trigrammähnlichkeit und Volltextsuche mit Q ind django unter Verwendung von Postgres kombiniert wurden

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"