Chociaż instrukcja LIKE (dopasowanie częściowe) nie jest obsługiwana w wyszukiwaniu pełnotekstowym, ale można ją zhakować.
Najpierw tokenize ciąg danych dla wszystkich możliwych podciągów (cześć = h, on, hel, lo, itp)
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
tworzenia indeksu + dokument (Search API), używając tokenized ciągi
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)
Wykonuj wyszukiwanie, a 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/
To działa dobrze. Udało mi się zmodyfikować funkcję search.index Ferrisa, aby automatycznie tokenizować wszystkie pola tekstowe (jedna zmiana linii) i "po prostu działa". Po prostu nie próbuj wyświetlać tego pola do użytkownika bezpośrednio z wyniku wyszukiwania;) –
Dodałem także 'name.lower()' ponieważ miałem pewne dziwne problemy z językiem rosyjskim: jeśli token zaczyna się od dużej litery Nie mogłem znaleźć takiego żetonu. –
przyjazna uwaga: fraza to "voila!" –