debug_mode=ON

Buscar en

 
 

Full Text en Google App Engine

Escrito por gimenete hace 1 años bajo una licencia de Creative Commons Creative Commons License
1004 visitas. Etiquetas: python, gae, app-engine

Es sorprendente que Google no soporte búsquedas de texto de manera eficiente en Google App Engine. Las funcionalidades que existen tienen importantes limitaciones y están poco o nada documentadas. No obstante voy a explicar a continuación cómo utilizar las funcionalidades existentes.

En el paquete google.appengine.ext.search se encuentra la clase SearchableModel. Esta es la clase base que tendremos que utilizar para poder realizar búsquedas de texto en las clases persistentes. En vez de extender de db.Model extenderemos de db.SearchableModel. Ejemplo:

class Mascota(search.SearchableModel):
    nombre = db.StringProperty(required=True)
    descripcion = db.TextProperty(required=True)

Cuando persistimos un objeto de la clase Mascota y acudimos al 'Data Viewer' de la consola de administración podemos ver que se ha añadido un campo '_searchabletext_index'. Este campo contiene una lista de todas las palabras que aparecen en todos los campos de texto del objeto que hemos guardado.

¿Por qué? ¿Cómo funciona esto? Bien, en el datastore podemos guardar fechas, texto, números,... y también podemos guardar listas de cadenas de texto (StringListProperty). Cuando un campo es de tipo StringListProperty podemos hacer una consulta con el operador igual (=) y podemos obtener objetos que contengan un valor concreto en alguna posición dentro de esa lista.

De modo que este es el fundamento de la clase SearchableModel: cuando un objeto es insertado o guardado se crea una lista de palabras que se utilizará posteriormente para buscar una palabra determinada.

No obstante esto no es necesario que lo sepamos porque la clase SearchableModel lo hace transparente a nosotros. Para hacer consultas ni si quiera necesitamos saber nada de que existe un campo '_searchabletext_index' que guarda una lista de palabras. La clase SearchableModel ya provee una manera de hacer búsquedas sin conocer de esos detalles internos. Así es como se hace:

mascotas = Mascota.all().search('perro')

Es así de sencillo. Ahora bien, por motivos de la implementación esto tiene serias limitaciones.

  • Existen unas denominadas stop-words. Estas palabras son palabras sin interés. Por ejemplo artículos (lo, la, le), preposiciones, pronombres,... SearchableModel filtra stop-words sólo en el idioma inglés. De modo que si insertamos contenido en otros idiomas nuestras listas de palabras no serán del todo óptimas.
  • La lista de palabras no guarda ninguna información de cuántas veces se repite una palabra, de modo que el resultado de una consulta de un término nos puede devolver un objeto que contenga 3 veces el término, luego otro que lo contenga 5 veces y luego otro objeto que lo tenga sólo una vez. Es decir, la implementación no permite ordenar por relevancia.
  • La implementación no es interna del datastore, es una implementación 100% Python que puede consumir demasiado tiempo de CPU.
  • La implementación indexa todos los campos que contengan texto. No es posible por tanto restringir la búsqueda a un subconjunto de los campos. Puede ocurrir que haya datos sensibles que no queremos indexar... o simplemente que no sean relevantes.

Conclusiones

La solución actual es a todas luces insuficiente. Parece una solución para salir del paso mientras implementa un FULL TEXT de verdad. Y más cuando se trata de lo que se trata: de Google, el rey de las búsquedas en Internet.

Para "presionar" un poco a Google podéis votar el issue. Debéis estar logueados y clicar en la estrella.

 

¡Votalo! 5 votos
¡Compártelo!

        

&nbps;

&nbps;

gimenete

Sobre gimenete

Gimenete es un tipo al que le encanta programar. Lleva media vida programando en Java, y ahora le da bastante también a Python. No le hace ascos a JavaScript. Su tema de investigación favorito ahora es el cloud computing.

 
Regístrate o haz login para participar.
¿Todavía no conoces debugmodeon?
debugmodeon es la red social para profesionales de la informática
descubre debugmodeon
 

2 comentarios en "Full Text en Google App Engine"

yeradis
yeradis escribió
hace 1 años

#1   

Saludos y buen dia gimenete

Tengo una pregunta dado que soy "neofito" en esto del python y por tanto en el Google App Engine

me podrias decir el import como lo definistes ?

es que yo puse :

from google.appengine.ext.search import search

y despues algo asi como lo que pusistes tu
y el GAE me dijo que na de na y me devolvia un error 500

:(

Sin mas....
Me despido

 

gimenete
gimenete escribió
hace 1 años

#2   

Es posible que tengas un error de sintaxis en algún lado.

Prueba en local y mira la traza de error.

Editado 1 veces. La última vez hace hace 1 años.

 
 
 
 

© Copyright 2008-2009 debug_mode=ON | Aviso legal | Contacto | FAQ | ¿Quiénes somos? |