PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Desempenho ruim quando a similaridade de trigramas e a pesquisa de texto completo foram combinadas com Q ind django usando postgres


Sem o código de classe é difícil encontrar a melhor maneira de otimizar sua consulta.

Você pode adicionar um Gin ou Gist index para acelerar a similaridade do trigrama.

Você pode criar uma anotação com o SearchVector como abaixo:
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)
)

Você pode acelerar a pesquisa de texto completo usando um SearchVectorField

Para saber mais sobre pesquisa de texto completo e trigrama, você pode ler o artigo que escrevi sobre o assunto:

"Pesquisa de texto completo em Django com PostgreSQL"