2010-02-12 20 views
18

Necesito implementar la búsqueda de texto completo para mi aplicación Django, ejecutando MySQL como back-end.Django MySQL búsqueda de texto completo

Digamos que tengo un modelo de la siguiente manera:

class MyItem(models.Model): 
    title = models.CharField() 
    short_description = models.TextField() 
    description = models.TextField() 

me gustaría tener resultados en primer lugar para las apariciones de términos de búsqueda en el título, a continuación, en short_description y al final en el campo de descripción. Seré más feliz si no tengo que usar módulos/aplicaciones adicionales para esta tarea.

Respuesta

5

Si usted está buscando una solución rollizo recomiendo http://haystacksearch.org/

Está muy bien pensado.

+0

Supongo que terminaré con una solución de terceros que traté de evitar. – edkirin

+0

Sí, ¿podría necesitar aclarar por qué esa es la solución que desea? esta opción mantendrá la base de datos independiente y se ampliará bien a medida que agrega modelos de db a los criterios de búsqueda. Por ejemplo, en un proyecto comencé a usar el pajar para una tabla, pero el producto final consultaba diez. Sin embargo, no olvides Si sabes exactamente lo que quieres en términos de raw sql puedes usarlo. http://docs.djangoproject.com/en/dev/topics/db/sql/. Buena suerte – michael

23

Usted puede utilizar la búsqueda de texto completo en Django

MyItem.objects.filter(title__search="some search text") 

Una cosa es - no se puede definir un índice de texto completo de un modelo de Django, que tiene que hacer directamente en una base de datos (usando phpMyAdmin o SQL consulta)

documentación

Ver Django para la búsqueda campo denominado search

+3

Así que no hay forma de hacerlo en múltiples columnas, ¿verdad? –

+0

Esto no funciona de manera predeterminada cuando se usa MySQL porque no usa la tabla tipo MyISAM. Se obtiene el error "El tipo de tabla utilizada no es compatible con los índices FULLTEXT" – Timmmm

+0

@SilverLight cómo hacerlo contra varias columnas como para el índice de búsqueda compuesto 'FULLTEXT'? –

4

no sé si ayuda ahora, pero he creado una nueva biblioteca de Python para Django que apoya MySQLs' y MariaDBs nativa de texto completo motor de búsqueda en uno o varias columnas:

Puede tener una mirada en ella en el GitHub repository

También hay una descripción de cómo instalarlo, usarlo y cómo crear la materia FULLTEXT INDEX a través de las migraciones de Django (Django 1.7+).

Si ha configurado los índices y establecer el SearchManager para su modelo debe ser capaz de ejecutar algo como:

Mymodel.objects.search('Something') 
Mymodel.objects.search('Somet*') 
Mymodel.objects.search('+Something -Awesome') 

Sólo quería actualizar este tema porque no he encontrado una solución aceptable por lo a lo largo y que podría ayudar a alguien allí también :)

Saludos Domi

0

De Django docs con respecto a la búsqueda de texto completo:

Ejemplo:

Entry.objects.filter(headline__search="+Django -jazz Python")

equivalente SQL:

SELECT ... WHERE MATCH(tablename, headline) AGAINST (+Django -jazz Python IN BOOLEAN MODE);

Nota esto sólo está disponible en MySQL y requiere manipulación directa de la base de datos para añadir el texto completo índice. Por defecto, Django usa BOOLEAN MODE para búsquedas de texto completo. Consulte MySQL documentation para obtener detalles adicionales.

Ahora a la manipulación directa de la base de datos. En MySQL puede crear un índice de texto siguiendo estos pasos (source article):

  • Abierto de comandos y escriba mysql -u root -p. En el prompt ingrese la contraseña de root.
  • Ingrese use your_db_name para cambiar a su base de datos django.
  • Ingrese CREATE FULLTEXT INDEX index_name ON table_name (column_names).

Eso es todo! Indización FTS habilitada en su base de datos django. Ahora puede usar el rico QuerySet API de django para hacer búsquedas de texto completo.

Cuestiones relacionadas