Your SlideShare is downloading. ×
Como implementar una búsqueda por full-text-search en django para buscar en múltiples tablas con Mysql?
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Como implementar una búsqueda por full-text-search en django para buscar en múltiples tablas con Mysql?

684
views

Published on

Interesante articulo de como realizar full text search desde django

Interesante articulo de como realizar full text search desde django

Published in: Marketing

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
684
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Full text search Django Como implementar una búsqueda por full-text-search en django para buscar en múltiples tablas con Mysql?
  • 2. Eloquenti@ Solutions SA de CV Como implementar una búsqueda por full-text-search en django para buscar en múltiples tablas con Mysql Django ofrece la posibilidad de crear búsquedas de texto completo para mysql, con los índices de texto completo que tiene mysql. Estas búsquedas solo se pueden realizar a los índices de una sola tabla, por lo que si se quiera hacer búsquedas por índices que estén en diferentes tablas hay que generar la consulta sql. En este artículo veremos una forma genérica de hacer esto. Myql Mysql desde la versión 5.6 tiene soporte para los índices de búsqueda de texto completo en InnoDb, puesto que en versiones anteriores solo estaba disponible para MyIsam. Se utilizará InnoDb para este ejemplo. La sintaxis mysql para crear los índices de texto completo sería de la siguiente manera. mysql> CREATE FULLTEXT INDEX <nombre_del_indice> ON <nombre_tabla> (<nombre_campo1_a_aplicar_indice> [, <nombre_campo2_a_aplicar_indice>, [, <nombre_campo3_a_aplicar_indice>]]); La sintaxis de la consulta sería la siguiente: MATCH(col1,col2,...) AGAINST (expr [modificador_de_Busqueda]) Los modificadores de búsqueda pueden ser los siguientes: modificador_de_Busqueda: { IN NATURAL LANGUAGE MODE | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION | IN BOOLEAN MODE | WITH QUERY EXPANSION } IN NATURAL LANGUAGE MODE Este modificador permite buscar las palabras en texto natural. Ejemplo: mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE); +----+-------------------+------------------------------------------+ | id | title | body | +----+-------------------+------------------------------------------+ Ave Yaxhilan #94, SM 22, MZ 13, Lote 39, Dpto C, Cancún, CP 77500, Quintana Roo, México. (52) 998-884-1847 (52) 998-154-1205 http://www.eloquentia.simart.dtdns.net/ eloquentia.solutions@gmail.com
  • 3. Eloquenti@ Solutions SA de CV | 1 | MySQL Tutorial | DBMS stands for DataBase ... | | 5 | MySQL vs. YourSQL | In the following database comparison ... | +----+-------------------+------------------------------------------+ Esta sentencia retorna todas las tuplas que contengan “database” en la tabla articules en algunos de los campos title o body. Esta búsqueda en MyISAM tiene la peculiaridad de que si la palabra por la que se busca está en más del 50% de las tuplas de la tabla, la búsqueda no retornará ningún resultado. IN BOOLEAN MODE La búsqueda en forma booleana permite adicionar modificadores a la búsqueda. Ejemplo: mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE); Esta búsqueda es similar a la anterior pero se le agregaron los modificadores: + Que significa que todas las tuplas retornadas tiene que contener “MySQl” (and) - Que tiene que eliminar las tuplas que contengan “ YourSQL” de la respuesta (not) El (or) es por omisión. Para este documento se escogió el modo booleano. Para una consulta donde intervengan más de una tabla las consultas tendrían la siguiente estructura sql. mysql> SELECT * FROM tabla1 INNER JOIN tabla2 ON ( tabla1.tabl2_id = tabla2.id ) INNER JOIN tabla3 ON ( tabla2.tabl3_id = tabla3.id ) WHERE MATCH(tabla1.indice_full_text1, tabla1.indice_full_text2) AGAINST ('palabra_a_buscar' IN BOOLEAN MODE) OR MATCH(tabla2.indice_full_text1, tabla2.indice_full_text2) Ave Yaxhilan #94, SM 22, MZ 13, Lote 39, Dpto C, Cancún, CP 77500, Quintana Roo, México. (52) 998-884-1847 (52) 998-154-1205 http://www.eloquentia.simart.dtdns.net/ eloquentia.solutions@gmail.com
  • 4. Eloquenti@ Solutions SA de CV AGAINST ('palabra_a_buscar' IN BOOLEAN MODE) OR MATCH(tabla3.indice_full_text1) AGAINST ('palabra_a_buscar' IN BOOLEAN MODE); Ejemplo: mysql> SELECT * FROM userprofile INNER JOIN auth_user ON ( userprofile.user_id = auth_user.id ) WHERE ( auth_user.is_active = True AND ( OR ) MATCH(auth_user.username, auth_user.first_name, auth_user.last_name, auth_user.email) AGAINST ('cuba' IN BOOLEAN MODE) MATCH(userprofile.upCountry) AGAINST ('cuba' IN BOOLEAN MODE) ); Django Para logar este tipo de consultas es necesario extender la API de base de datos de Django. Para esto lo primero es crear un Manager y un QuerySet que tengan un método de búsqueda llamado search. Por lo tanto se crea una clase SearchManager que herede de models.Manager y SearchQuerySet que herede de models.query.QuerySet. A continuación se muestra el código de estas clases: Ave Yaxhilan #94, SM 22, MZ 13, Lote 39, Dpto C, Cancún, CP 77500, Quintana Roo, México. (52) 998-884-1847 (52) 998-154-1205 http://www.eloquentia.simart.dtdns.net/ eloquentia.solutions@gmail.com
  • 5. Eloquenti@ Solutions SA de CV Esta clase va a ser el manager del modelo al cual se le quiere hacer una búsqueda de texto completo. Hay dos formas en las cuales se puede utilizar, una es instanciándola en el atributo objects del modelo. Ejemplo: En este caso al objeto objects del modelo le estamos diciendo que instancie un objeto SearchManager y que sus índices de texto completo serán (username del modelo user, first_name del modelo user_ last_name del modelo user_ email del modelo user y upCountry del mismo) Nótese que se utiliza “__” (dos guiones bajo) para navegar por las relaciones entre tablas como mismo se hace en la función filter. La segunda forma es cuando el usuario necesita sobrescribir la clase manager para adicionarle funcionalidades nuevas como se muestra en la siguiente figura. En este caso ese manager tiene que heredar de SearchManager y sobrescribir el constructor de la clase para adicionarle los índices de texto completo. Ave Yaxhilan #94, SM 22, MZ 13, Lote 39, Dpto C, Cancún, CP 77500, Quintana Roo, México. (52) 998-884-1847 (52) 998-154-1205 http://www.eloquentia.simart.dtdns.net/ eloquentia.solutions@gmail.com
  • 6. Eloquenti@ Solutions SA de CV Una vez ya visto como está programado el manager y como utilizarlo se comenzará a ver la clase SearchQuerySet la cual es la encargada de construir la consulta y ejecutarla. A esta clase se le sobrescribe el constructor para adicionarle los índices de texto completo. También hay que sobrescribir el método clone para cuando se clone la misma no se pierdan los índices y se adiciona un método _filtter_params que se encargará de eliminar cualquier carácter que pueda hacer una inyección sql en la cadena de entrada. Por último la función search que es la encargada de construir la consulta: Ave Yaxhilan #94, SM 22, MZ 13, Lote 39, Dpto C, Cancún, CP 77500, Quintana Roo, México. (52) 998-884-1847 (52) 998-154-1205 http://www.eloquentia.simart.dtdns.net/ eloquentia.solutions@gmail.com
  • 7. Eloquenti@ Solutions SA de CV Los códigos de estos ejemplos se encuentran en el fichero código.py Ave Yaxhilan #94, SM 22, MZ 13, Lote 39, Dpto C, Cancún, CP 77500, Quintana Roo, México. (52) 998-884-1847 (52) 998-154-1205 http://www.eloquentia.simart.dtdns.net/ eloquentia.solutions@gmail.com

×