2010-07-20 19 views
13

Estoy trabajando en un proyecto GAE Django donde tengo que implementar la funcionalidad de búsqueda, he escrito una consulta y recupera los datos de acuerdo con la palabra clave de búsqueda.¿Cómo hacer consultas de filtro insensibles a mayúsculas y minúsculas con Google App Engine?

portfolio = Portfolio.all().filter('full_name >=',key).filter('full_name <',unicode(key) + u'\ufffd') 

El problema con esta consulta es que es sensible a mayúsculas y minúsculas.

¿Hay alguna forma de hacerlo funcionar, sin depender del caso de la palabra clave?

Sugerido.

Gracias de antemano.

Respuesta

20

Necesita almacenar versiones normalizadas de sus datos en tiempo de escritura, luego use la misma normalización para buscar.

tienda los datos, ya sea en mayúsculas o minúsculas, opcionalmente eliminar puntuacion y el cambio de todos los espacios a un solo espacio y tal vez la conversión de caracteres no ASCII en cierta representación razonable ASCII (que es, por supuesto, más difícil que suena.)

+0

Gracias por su respuesta Wooble. Pero el proyecto es un proyecto de mantenimiento y, por lo tanto, ya tiene muchos datos que están siendo utilizados por muchas páginas. Realizar cambios en los datos ahora requeriría una buena cantidad de esfuerzo, es decir, realizar cambios en todas las vistas donde se están procesando los datos. ¿No hay alguna forma de hacerlo funcionar con la estructura actual? –

+3

No es necesario que realice cambios en todas las vistas, etc. Simplemente agregue un campo llamado foo_uppercase, y haga que una tarea revise todas sus entidades 1000 a la vez o algo así y complete el campo. –

+0

@Jason gracias por su respuesta. Pero incluso entonces, será necesario cambiar para cambiar todos los valores del almacén de datos existentes para que esta propiedad se modifique en mayúscula o minúscula. –

1

Una solución alternativa a este problema - en donde los conjuntos de datos son pequeñas - es filtrar los resultados en pitón después de haberlos llamado desde el almacén de datos:

for each_item in list_of_results: 
    if each_item.name.lower().rfind(your_search_term) != -1: 
     #Your results action 
Cuestiones relacionadas