2009-09-10 24 views
5

Estoy comenzando con Python en Google App Engine construyendo una base de datos de contactos. ¿Cuál es la mejor forma de implementar la búsqueda con comodines?Búsqueda de comodines en Appengine en python

Por ejemplo, ¿puedo hacer una consulta ('name =',% ewman%)?

+1

Para una coincidencia parcial con GAE Search API: http://stackoverflow.com/questions/12899083/partial-matching-gae-search-api/13171181#13171181 –

Respuesta

11

Desafortunadamente, Google App Engine no puede hacer texto parcial coincide

From the docs:

Consejo: Los filtros de consulta no tienen una forma explícita para que coincida con sólo una parte de un valor de cadena, pero se puede fingir un partido de prefijo utilizando la desigualdad filtros:

db.GqlQuery("SELECT * FROM MyModel WHERE prop >= :1 AND prop < :2", "abc", u"abc" + u"\ufffd") 

Esto coincide correo una entidad muy MyModel con un elemento de propiedad de cadena que comienza con los caracteres abc. La cadena unicode u "\ ufffd" representa el carácter Unicode más grande posible. Cuando los valores de las propiedades se ordenan en un índice, los valores que caen en este rango son todos los valores que comienzan con el prefijo dado.

+0

Gracias seth. Esa parece una gran limitación. ¿Te preguntas cómo implementan las coincidencias parciales en contacts.google.com? Tal vez tenga que quedarse con una base de datos SQL normal. –

+0

Estoy de acuerdo. Parece que hay algunos complementos que intentan hacer una búsqueda de texto completo pero no los he probado. Este 'parece' el más popular: http://code.google.com/p/app-engine-patch/ – seth

+0

Seguir con una 'base de datos SQL normal' no ayuda, porque un DB SQL realiza un escaneo completo de la tabla para ejecutar esa consulta, ¡no escalable en absoluto! Ver mi respuesta para más detalles. –

3

App Engine no puede hacer "me gusta" a las consultas, porque no puede hacerlas de manera eficiente. Tampoco puede su base de datos SQL: una consulta 'foo LIKE "% bar%"' solo se puede ejecutar haciendo un escaneo secuencial en toda la tabla.

Lo que necesita es un índice invertido. La búsqueda básica de texto completo está disponible en App Engine con SearchableModel. Bill Katz ha escrito una versión mejorada here, y hay una solución comercial para App Engine (con una versión gratuita) disponible here.