sql >> Databáze >  >> RDS >> PostgreSQL

Špatný výkon, když byla podobnost trigramů a fulltextové vyhledávání kombinováno s Q ind django pomocí postgres

Bez kódu třídy je obtížné najít lepší způsob optimalizace dotazu.

Můžete přidat Gin nebo Gist index pro urychlení podobnosti trigramů.

Anotaci můžete vytvořit pomocí SearchVector jak je uvedeno níže:

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)
)

Fulltextové vyhledávání můžete urychlit pomocí SearchVectorField

Chcete-li se dozvědět o fulltextovém vyhledávání a trigramu, můžete si přečíst článek, který jsem na toto téma napsal:

"Fulltextové vyhledávání v Django s PostgreSQL"



  1. O kolik rychlejší je MyISAM ve srovnání s InnoDB?

  2. Proč nemůžeme použít silný referenční kurzor s dynamickým příkazem SQL?

  3. Chyba #1442 MySQL - vytvoření spouštěče

  4. PostgreSQL:UPDATE znamená přesun mezi oddíly