Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

244
Vistas
Coincidencia de una o más palabras clave con la búsqueda de texto completo de Postgres de Django

Si busco en un sitio web con varias palabras clave (y sin comillas), como coche rojo , mi expectativa es que los elementos que contengan "coche rojo" sean exactamente los primeros, seguidos de los elementos que contengan ambas palabras clave (pero no secuencialmente) , seguido de elementos que contengan una de las palabras clave. (Creo que este es el comportamiento predeterminado en sistemas similares a Lucene, pero ha pasado un tiempo desde que los usé, así que no puedo decirlo con certeza).

Mi esperanza era que la búsqueda de texto completo de Postgres hiciera esto automáticamente, pero mis primeras pruebas muestran que este no es el caso:

 ## ASSUME: items in database: <blue car>, <green car>, <red truck> keywords = "red car" items = ForSaleItem.objects.filter(name__search=keywords) ## RESULT: items is empty/None, whereas it should have each of ## the items since one keyword matches.

El truco que veo es usar el operador de disyunción de Django, pero espero que haya algo menos complicado. También estoy bastante seguro de que este truco no pondría coincidencias exactas en la parte superior de la lista. Aquí está el truco:

 from django.db.models import Q keyword_query = Q() for keyword in keywords.split(' '): keyword_query.add(Q(name__search=keyword), Q.OR) items = ForSaleItem.objects.filter(keyword_query)

¿Hay alguna configuración/API que me falta (o algo implementable en el lado de postgres) que obtiene la funcionalidad que espero?

about 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Gracias a @Dharshan por indicarme la dirección correcta. Como él o ella señaló, la disyunción de los objetos SearchQuery permitirá la coincidencia de cualquiera de las palabras clave. Además, para tener elementos que contengan ambas palabras clave en la parte superior de la lista, como se describe en los documentos de búsqueda de texto completo de Django , la clase SearchRank se puede usar de la siguiente manera:

 vector = SearchVector('name') query = SearchQuery('red') | SearchQuery('car') items = ForSaleItem.objects.annotate(rank=SearchRank(vector, query)).order_by('-rank')
about 4 years ago · Santiago Trujillo Denunciar

0

items = ForSaleItem.objects.filter(name__contains=keywords)
about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda