2012-06-09 13 views
9

uso la API de búsqueda de Google App Engine (https://developers.google.com/appengine/docs/python/search/). He indexado todas las entidades y la búsqueda funciona bien. pero solo si busco las coincidencias exactas en caso contrario, devuelve 0 resultados. Por ejemplo:Google App Engine (python): API de búsqueda: String Search

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) 

si corro el siguiente script hago obtener resultados de la siguiente manera:

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') 

pero si cambio el query_string a "United Kin" o "United" devolverlo 0 resultados de la siguiente manera:

search.SearchResults(number_found='0') 

Quiero utilizar esta API para la búsqueda normal y AutoSuggest. ¿Cuál sería la mejor manera de lograr esto?

Respuesta

16

El API de búsqueda de texto completo de App Engine no admite la coincidencia de subcadenas.

Sin embargo, necesitaba este comportamiento para apoyar sugerencias de búsqueda a medida que el usuario escribe. Aquí está mi solución para eso:

""" 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))]) 

La idea básica es generar manualmente palabras clave separadas para cada posible subcadena. Esto solo es práctico para oraciones cortas, pero funciona muy bien para mis propósitos.

+0

Gracias por su respuesta, pero tengo en silencio un gran almacén de datos, si hago eso para cada entidad en el almacén de datos ¿no afectaría el tamaño del almacén de datos? Tengo como 4 diferentes modelos de búsqueda y cada uno de ellos tiene más de 100.000 registros en promedio. – Amyth

+0

Sí, tendría que almacenar estas palabras clave generadas automáticamente junto con el resto de sus datos. –