2010-07-20 3 views
13

Je travaille sur un projet GAE Django où je dois implémenter la fonctionnalité de recherche, j'ai écrit une requête et récupère les données en fonction du mot-clé de recherche.Comment faire des requêtes de filtre insensible à la casse avec Google App Engine?

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

Le problème avec cette requête est, qu'il est sensible à la casse.

Y at-il un moyen par lequel je peux le faire fonctionner, sans dépendre du cas du mot-clé?

Veuillez nous suggérer.

Merci d'avance.

Répondre

20

Vous devez stocker des versions normalisées de vos données au moment de l'écriture, puis utiliser la même normalisation pour la recherche. Stockez les données en majuscules ou en minuscules, en supprimant facultativement la ponctuation et en remplaçant tous les espaces dans un espace unique et en convertissant éventuellement des caractères non-ASCII en une représentation ASCII raisonnable (ce qui est bien sûr plus délicat que ça en a l'air).

+0

Merci pour votre réponse Wooble. Mais le projet est un projet de maintenance et a déjà beaucoup de données qui sont utilisées par beaucoup de pages. Apporter des modifications aux données maintenant nécessiterait beaucoup d'efforts, c'est-à-dire apporter des modifications à toutes les vues où les données sont rendues. N'y a-t-il aucun moyen de le faire fonctionner avec la structure actuelle? –

+3

Vous n'avez pas forcément besoin d'apporter des modifications à toutes les vues, etc. Ajoutez simplement un champ appelé foo_uppercase, et faites une tâche sur toutes vos entités 1000 à la fois ou quelque chose et remplissez le champ. –

+0

@Jason merci pour votre réponse. Mais même alors, il faudra changer de changer toutes les valeurs de banque de données existantes pour cette propriété à modifier en majuscules ou en minuscules? –

1

Une solution alternative à ce problème - où les ensembles de données sont de petite taille - est de filtrer les résultats en python après les avoir appelé du datastore:

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