2010-07-20 11 views
13

Sto lavorando a un progetto GAE Django in cui devo implementare la funzionalità di ricerca, ho scritto una query e recupera i dati in base alla parola chiave di ricerca.Come rendere le query con filtro senza distinzione tra maiuscole e minuscole con Google App Engine?

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

Il problema con questa query è che è case sensitive.

C'è un modo attraverso il quale posso farlo funzionare, senza dipendere dal caso della parola chiave?

Si prega di suggerire.

Grazie in anticipo.

risposta

20

È necessario memorizzare versioni normalizzate dei dati al momento della scrittura, quindi utilizzare la stessa normalizzazione per la ricerca.

Memorizza i dati in maiuscolo o in minuscolo, rimuovendo facoltativamente la punteggiatura e cambiando tutti gli spazi bianchi in un singolo spazio e convertendo i caratteri non ASCII in una rappresentazione ASCII ragionevole (che è, ovviamente, più complicata di quanto sembri).

+0

Grazie per rispondi Wooble. Ma il progetto è un progetto di manutenzione e quindi ha già molti dati che vengono utilizzati da molte pagine. Apportare modifiche ai dati ora richiederebbe un notevole sforzo, ovvero apportare modifiche a tutte le viste in cui viene eseguito il rendering dei dati. Non c'è un modo per farlo funzionare con la struttura attuale? –

+3

Non dovresti necessariamente apportare modifiche a tutte le viste, ecc. Basta aggiungere un campo chiamato foo_uppercase e fare in modo che un'attività superi tutte le entità 1000 alla volta o qualcosa del genere e compila il campo. –

+0

@Jason ringrazia per la risposta. Ma anche in questo caso sarà necessario cambiare i valori di tutti i datastore esistenti per questa proprietà da modificare in maiuscolo o in maiuscolo? –

1

Una soluzione alternativa a questo problema - in cui i dataset sono piccoli - è quello di filtrare i risultati in pitone dopo averli chiamati dal datastore:

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