Anche se l'istruzione LIKE (corrispondenza parziale) non è supportata nella ricerca di testo completo, ma è possibile modificarla.
In primo luogo, tokenize la stringa di dati per tutte le possibili stringhe (ciao = h, egli, Hel, ecco, ecc)
def tokenize_autocomplete(phrase):
a = []
for word in phrase.split():
j = 1
while True:
for i in range(len(word) - j + 1):
a.append(word[i:i + j])
if j == len(word):
break
j += 1
return a
costruire un indice + documento (Search API) utilizzando le stringhe tokenized
index = search.Index(name='item_autocomplete')
for item in items: # item = ndb.model
name = ','.join(tokenize_autocomplete(item.name))
document = search.Document(
doc_id=item.key.urlsafe(),
fields=[search.TextField(name='name', value=name)])
index.put(document)
Eseguire la ricerca e walah!
results = search.Index(name="item_autocomplete").search("name:elo")
https://code.luasoftware.com/tutorials/google-app-engine/partial-search-on-gae-with-search-api/
fonte
2012-11-01 04:57:18
Questo metodo funziona bene. Sono riuscito a modare la funzione search.index di Ferris per tokenizzare automaticamente tutti i campi di testo (un cambio di riga), e "funziona". Basta non cercare di visualizzare detto campo per un utente direttamente dal risultato della ricerca;) –
Ho anche aggiunto 'name.lower()' perché ho avuto alcuni strani problemi con la lingua russa: se un gettone inizia con una lettera maiuscola Non ero in grado di trovare un tale segno. –
nota amichevole: la frase è "voilà!" –