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

38 %
63 %
Information about Como implementar una búsqueda por full-text-search en django para buscar...
Marketing

Published on February 18, 2014

Author: arcanetdeveloper

Source: slideshare.net

Description

Interesante articulo de como realizar full text search desde django

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

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

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

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

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

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

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

Add a comment

Related presentations

Related pages

Full Text Search en MySQL - Fabio.com.ar

Full Text Search en MySQL, ... detalladamente como hago una encuesta en php con mysql. como hago ... Como hago para buscar trozos de palabras: por ...
Read more

Compartir datos entre controladores en AngularJS - Unodepiera

Mysql; Python; Django; ... Calendario con múltiples meses en ... El $scope.msg contiene un array que voy a utilizar para pasarlo como parámetro a una ...
Read more

Autocompletar con php[DEMO] - Unodepiera

En este tutorial vamos a ver como crear un autocompletar con php y mysql ... Autocompletar con ... con join para agregar otras tablas en ...
Read more

Tutoriales de PHP, MySQL y Servidor - cristalab.com

Crear datos con Faker, una librería PHP en Laravel Por ... y crear tablas con Laravel; Como usar y ... de una búsqueda con PHP + MySQL para ...
Read more

THINKING OUT LOUD | But instead of that, it cuts like a knife

... o pasa por #django en irc.freenode.net para chatear ... para administrar múltiples sitios con una ... (como las modificaciones en tablas o ...
Read more

Aprender Django desde cero. Tema 6: Django | ignacio perez ...

... para una instancia de Django (no penséis en ... con hora/, así como /foo/bar/hora/. Por ... Django crea otras tablas auxiliares para ...
Read more

Posts of Blog Bases de datos - sites.google.com

... a MySQL como manejadores de bases de datos por ... SQL full-text search ... una búsqueda de hoteles en una cierta ciudad con la ...
Read more

Blog | La comunidad de usuarios de Python en Tijuana y ...

... el resultado de una búsqueda con el API de youtube, en caso de ... de nuestro proyecto Django para que trabaje con ... como Django por ...
Read more

Generales | THINKING OUT LOUD

... o pasa por #django en irc.freenode.net para chatear ... para administrar múltiples sitios con una ... (como las modificaciones en tablas o ...
Read more

Microsoft SQL Server - Wikipedia, la enciclopedia libre

Se utiliza para almacenar tablas temporales creadas por ... en SQL Server con OLE DB como interfaz para ... Full Text Search (Búsqueda de ...
Read more