Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

243
Views
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 answers
Answer question

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 Report

0

items = ForSaleItem.objects.filter(name__contains=keywords)
about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!