9

Ich verwende die Google App Engine-Such-API (https://developers.google.com/appengine/docs/python/search/). Ich habe alle Entitäten indiziert und die Suche funktioniert gut. aber nur wenn ich nach den genauen Übereinstimmungen suche, gibt es sonst 0 Ergebnisse zurück. Zum Beispiel:Google App Engine (Python): Such-API: Zeichenfolge Suche

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) 

wenn ich das folgende Skript i laufen Ergebnisse tun bekommen wie folgt:

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

, aber wenn ich die query_string zu "United Kin" oder "United" es 0 Ergebnisse angezeigt wie folgt ändern:

search.SearchResults(number_found='0') 

Ich möchte diese API für die normale Suche und AutoSuggest verwenden. Was wäre der beste Weg, dies zu erreichen?

Antwort

16

App Engine-Volltextsuch-API unterstützt keine Teilzeichenfolgenübereinstimmung.

Allerdings benötigte ich dieses Verhalten selbst, um Suchvorschläge zu unterstützen, wie der Benutzer tippt. Hier ist meine Lösung dafür:

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

Die Grundidee ist, manuell separate Schlüsselwörter für jede mögliche Teilkette zu generieren. Dies ist nur praktisch für kurze Sätze, aber es funktioniert gut für meine Zwecke.

+0

Vielen Dank für Ihre Antwort Nick, aber ich habe einen großen Datenspeicher ruhig, wenn ich das für jede Entität im Datenspeicher tun würde, würde das nicht die Größe des Datenspeichers auswirken? Ich habe 4 verschiedene durchsuchbare Modelle und jeder von ihnen haben mehr als 100.000 Datensätze im Durchschnitt. – Amyth

+0

Ja, Sie müssten diese automatisch generierten Keywords neben dem Rest Ihrer Daten speichern. –