python - google - API de búsqueda GAE de coincidencia parcial
python google api search (5)
Tengo el mismo problema para el control de escritura anticipada, y mi solución es analizar cadena a pequeña parte:
name=''hello world''
name_search = '' ''.join([name[:i] for i in xrange(2, len(name)+1)])
print name_search;
# -> he hel hell hello hello hello w hello wo hello wor hello worl hello world
Espero que esto ayude
¿Usando la API de búsqueda de GAE es posible buscar una coincidencia parcial?
Intento crear la funcionalidad de autocompletar, donde el término sería una palabra parcial. p.ej.
> b
> bui
> construir
todos regresarían a "construir".
¿Cómo es esto posible con GAE?
al igual que la respuesta @Desmond Lua, pero con una función de tokenize diferente:
def tokenize(word): token=[] words = word.split('' '') for word in words: for i in range(len(word)): if i==0: continue w = word[i] if i==1: token+=[word[0]+w] continue token+=[token[-1:][0]+w] return ",".join(token)
analizará hello world
como he,hel,hell,hello,wo,wor,worl,world
.
es bueno para el propósito de autocompletar ligero
Tal como se describe en la búsqueda de texto completo y la declaración LIKE , no es posible, ya que la API de búsqueda implementa la indexación de texto completo.
¡Espero que esto ayude!
Mi versión optimizada: no repetir tokens
def tokenization(text):
a = []
min = 3
words = text.split()
for word in words:
if len(word) > min:
for i in range(min, len(word)):
token = word[0:i]
if token not in a:
a.append(token)
return a
Aunque la instrucción LIKE (coincidencia parcial) no se admite en Full Text Search, pero podrías hackearla.
En primer lugar, tokenize la cadena de datos para todas las subseries posibles (hello = h, he, hel, lo, etc.)
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
Crea un documento de índice + (API de búsqueda) usando las cadenas tokenizadas
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)
Realizar búsqueda, y 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/