2010-08-20 19 views
5

estoy usando el __search filtro de consulta de Django para realizar una búsqueda por ejemplo texto completoDjango completo orden de búsqueda de texto por relevancia

MyModel.objects.filter(title__search = 'some title') 

¿Cómo llego a la orden por relevancia, ya que actualmente parece estar ordenando alfabéticamente ?

Específicamente me gustaría obtener resultados de búsqueda donde el título era some title para aparecer primero antes de algo que tenía el título a different but contains some title.

edición:

Lo que he notado es que en la definición del modelo de MyModel tengo:

class Meta: 
    ordering = ['title'] 

Si quito esto, entonces se convierte en el orden correcto es decir, ordenado por relevancia. Entonces, ¿hay alguna forma de que pueda dejar esto en la definición del modelo porque es útil en otro lugar pero luego, en mi consulta, le digo que lo ignore?

+1

No creo que realmente ordenado como usted espera. Solo por orden natural, como se señaló es una búsqueda booleana. –

+1

Voy a hacerme eco del comentario de Enrico: dada la respuesta que usted aceptó, parece que aún está comprendiendo erróneamente que los resultados realmente están ordenados por relevancia si elimina el orden del título. Ese no es el caso: no hay relevancia para ordenar, los está obteniendo en cualquier orden que la base de datos elija para dárselos. –

Respuesta

0

Probar: Model.objects.all().order_by().search() - llamando al order_by without any parameters does no ordering at all.

Más allá de eso: voy a secundar la recomendación de Carl de Haystack, sobre todo porque permite cosas más complicadas como derivar ("danza" combinaría "bailes", "bailarines" y "bailar"), faceting ("Muéstrame usuario & número de visitas para cada resultado de búsqueda "), obteniendo objetos que son similares a la que está exhibiendo actualmente, etc. Cuando probé Whoosh por última vez, fue inestable (es decir, se bloqueó durante la indexación) pero tardó un período hora de encender Solr, que es genial.

+0

He tenido muy buena suerte con Whoosh recientemente. Pero no hace todas las cosas elegantes: derivar sí, faceting no :( –

+0

Debo señalar que mi experiencia en Whoosh fue breve y hace un año. He oído que se ha estabilizado desde entonces, pero en realidad no la hemos necesitado ya que Solr ya lo necesitaba por varias razones (faceting, soporte para muchos idiomas). –

3

Como se notó here, la búsqueda es Boolean.

No existe tal coeficiente de relevancia para usar en el pedido.

A idea estúpida puede solicitar por longitud de título, lo que puede tener sentido.

2

La forma más fácil de obtener una buena búsqueda de texto completo en un proyecto de Django es el uso de la excelente Haystack aplicación. Es ridículamente fácil de configurar, especialmente si utiliza el motor de búsqueda más simple (Whoosh, que es puro Python). Puede configurar la indexación de texto completo de su contenido, con resultados ordenados por relevancia y muchas otras características interesantes además, en cuestión de minutos. Y si superas las limitaciones de desempeño/concurrencia/características de Whoosh, ya que estás usando Haystack para abstraer las características de búsqueda puedes intercambiar algo como Solr por Whoosh en cualquier momento.

0

Puede lograr esto usando una búsqueda sin formato con una cláusula ORDER BY para la relevancia si usa Django> = 1.2

File.objects.raw(query_string, params[x,y,z]) 

Aunque raw_querset tiene sus propias desventajas en este momento al no soportar el conteo(), por ejemplo.

Sin embargo, sí traer de vuelta los modelos también lo es bastante fácil de usar, aunque no es tan simple como __search

Cuestiones relacionadas