sql >> Base de Datos >  >> RDS >> PostgreSQL

Rendimiento deficiente cuando la similitud de trigramas y la búsqueda de texto completo se combinaron con Q ind django usando postgres

Sin el código de clase, es difícil encontrar la mejor manera de optimizar su consulta.

Puede agregar un Gin o Gist índice para acelerar la similitud del trigrama.

Puede crear una anotación con el SearchVector como a continuación:

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

Puede acelerar la búsqueda de texto completo usando Campo de vector de búsqueda

Para informarte sobre la búsqueda de texto completo y el trigrama, puedes leer el artículo que escribí sobre el tema:

"Búsqueda de texto completo en Django con PostgreSQL"