Teilweise passende GAE-Such-API

Mit der GAE-Such-API ist es möglich, nach einer partiellen Übereinstimmung zu suchen?

Ich versuche, autovervollständige Funktionalität zu erstellen, wo der Begriff ein Teilwort wäre. z.B.

> B
> Bui
> Bauen

Würden alle "Gebäude" zurückkehren.

Wie ist das mit GAE möglich?

5 Solutions collect form web for “Teilweise passende GAE-Such-API”

Obwohl LIKE-Anweisung (partielle Übereinstimmung) wird nicht in Volltextsuche unterstützt, aber du kannst es hacken.

Zuerst den Datenstring für alle möglichen Teilstrings (hallo = h, er, 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 

Erstellen Sie einen Index + Dokument (Such-API) mit den Token-Strings

 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) 

Suche dich und walah!

 results = search.Index(name="item_autocomplete").search("name:elo") 

Siehe auch: http://blog.startuptale.com/2012/10/partial-search-on-gae-with-search-api.html

Wie bei Volltextsuche und LIKE-Anweisung beschrieben , ist es nicht möglich, da die Such-API die Volltextindizierung implementiert.

Hoffe das hilft!

Genau wie @Desmond Lua Antwort, aber mit verschiedenen Token-Funktion:

 Def tokenize (wort):
   Token = []
   Words = word.split ('')
   Für Wort in Worten:
     Für I in Reichweite (len (Wort)):
       Wenn ich == 0: weiter
       W = wort [i]
       Wenn ich == 1: 
         Token + = [Wort [0] + w]
         fortsetzen

       Token + = [token [-1:] [0] + w]

   Rückgabe "," beitreten (Token)

Es wird hello world analysieren, wie he,hel,hell,hello,wo,wor,worl,world .

Es ist gut für leichte autovervollständige Zwecke

Ich habe das gleiche Problem für typeahead Kontrolle, und meine Lösung ist Parse String zu kleinen Teil:

 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 

Ich hoffe das hilft

Meine Version optimiert: nicht wiederholen Token

 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 
  • Wie man ein Element aus einer Liste in Pymongo abfragen kann
  • Ersetzen Sie Strings in Dateien von Python
  • Verfolgung von Fliesen in einer * Suche
  • Suchen Sie nach einer beliebigen Anzahl von unbekannten Teilstrings anstelle von * in einer Liste von String
  • Python-schreibprogramm, um eine csv-Datei zu implementieren, um das Feld zu platzieren und das Ergebnis in einer anderen Datendatei zu speichern
  • Web2py Ajax suchen
  • Wie funktioniert die Suche in der Pythonarbeit?
  • F.seek () und f.tell (), um jede Zeile der Textdatei zu lesen
  • Re.search nicht zurückgeben Strings, aber re.findall tut
  • String-Count mit überlappenden Ereignissen
  • Suchformular mit django + python
  • Python ist die beste Programmiersprache der Welt.