sql >> Databasteknik >  >> RDS >> PostgreSQL

Dålig prestanda när trigramlikhet och fulltextsökning kombinerades med Q ind django med postgres

Utan klasskoden är det svårt att hitta ett bättre sätt att optimera din fråga.

Du kan lägga till en Gin eller Gist index för att påskynda trigramlikheten.

Du kan skapa en anteckning med SearchVector enligt nedan:

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

Du kan påskynda fulltextsökningen med en SearchVectorField

För att ta reda på om fulltextsökning och trigram kan du läsa artikeln jag skrev om ämnet:

"Full-Text Search in Django med PostgreSQL"



  1. MySQL med JOIN använder inte index

  2. Hur infogar man flera arrayer i en databas?

  3. Problem kvarstår med en java.util.Date i MySql med Hibernate

  4. hur tilldelar man värde till variabel i uttryck för ett PL/SQL-block?