2012-06-09 21 views
9

sto utilizzando l'API di ricerca di Google App Engine (https://developers.google.com/appengine/docs/python/search/). Ho indicizzato tutte le entità e la ricerca funziona correttamente. ma solo se cerco le corrispondenze esatte altrimenti restituisce 0 risultati. Per esempio:Google App Engine (python): API di ricerca: ricerca stringa

from google.appengine.api import search 

_INDEX_NAME = 'searchall' 


query_string ="United Kingdom" 
query = search.Query(query_string=query_string) 
index = search.Index(name=_INDEX_NAME) 

print index.search(query) 

se corro il seguente script faccio ottenere risultati come segue:

search.SearchResults(results='[search.ScoredDocument(doc_id='c475fd24-34ba-42bd-a3b5-d9a48d880012', fields='[search.TextField(name='name', value='United Kingdom')]', language='en', order_id='45395666'), search.ScoredDocument(doc_id='5fa757d1-05bf-4012-93ff-79dd4b77a878', fields='[search.TextField(name='name', value='United Kingdom')]', language='en', order_id='45395201')]', number_found='2') 

ma se cambio il query_string a "United Kin" o "United" è restituire 0 risultati come segue:

search.SearchResults(number_found='0') 

Desidero utilizzare questa API per la ricerca normale e AutoSuggest. Quale sarebbe il modo migliore per raggiungere questo obiettivo?

risposta

16

L'API di ricerca testo completo di App Engine non supporta la corrispondenza della sottostringa.

Tuttavia, avevo bisogno di questo comportamento per supportare i suggerimenti di ricerca mentre l'utente digita. Ecco la mia soluzione per questo:

""" Takes a sentence and returns the set of all possible prefixes for each word. 
    For instance "hello world" becomes "h he hel hell hello w wo wor worl world" """ 
def build_suggestions(str): 
    suggestions = [] 
    for word in str.split(): 
     prefix = "" 
     for letter in word: 
      prefix += letter 
      suggestions.append(prefix) 
    return ' '.join(suggestions) 

# Example use 
document = search.Document(
    fields=[search.TextField(name='name', value=object_name), 
      search.TextField(name='suggest', value=build_suggestions(object_name))]) 

L'idea di base è quella di generare manualmente le parole chiave separate per ogni possibile sottostringa. Questo è pratico solo per frasi brevi, ma funziona benissimo per i miei scopi.

+0

Grazie per la tua risposta nick, ma ho un datastore di grandi dimensioni, se lo faccio per ogni entità nel datastore non influirebbe la dimensione del datastore? Mi piacciono 4 diversi modelli ricercabili e ognuno di loro ha più di 100.000 record in media. – Amyth

+0

Sì, dovresti memorizzare queste parole chiave generate automaticamente insieme al resto dei tuoi dati. –

Problemi correlati