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.
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.
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.
yeradis escribió
hace 1 años
gimenete escribió
hace 1 años
Es posible que tengas un error de sintaxis en algún lado.
Prueba en local y mira la traza de error.
© Copyright 2008-2009 debug_mode=ON | Aviso legal | Contacto | FAQ | ¿Quiénes somos? |
#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