Frage

Eigentlich ganz einfach.Wenn ich in SQL ein Textfeld nach ein paar Zeichen durchsuchen möchte, kann ich Folgendes tun:

SELECT blah FROM blah WHERE blah LIKE '%text%'

In der Dokumentation für App Engine wird nicht erwähnt, wie dies erreicht werden kann, aber es handelt sich sicherlich um ein recht häufiges Problem?

War es hilfreich?

Lösung

BigTable, das Datenbank-Backend für App Engine, kann auf Millionen von Datensätzen skaliert werden.Aus diesem Grund lässt App Engine keine Abfragen zu, die zu einem Tabellenscan führen würden, da die Leistung für eine gut gefüllte Tabelle schrecklich wäre.

Mit anderen Worten: Jede Abfrage muss einen Index verwenden.Deshalb können Sie nur tun =, > Und < Abfragen.(Tatsächlich können Sie es auch tun != aber die API tut dies mithilfe einer Kombination von > Und < Dies ist auch der Grund, warum die Entwicklungsumgebung alle von Ihnen durchgeführten Abfragen überwacht und automatisch alle fehlenden Indizes zu Ihren hinzufügt index.yaml Datei.

Es gibt keine Möglichkeit, für a zu indizieren LIKE Abfrage, sodass sie einfach nicht verfügbar ist.

Schauen Sie sich das an diese Google IO-Sitzung für eine viel bessere und detailliertere Erklärung dazu.

Andere Tipps

Ich stehe vor dem gleichen Problem, habe aber auf den Google App Engine-Seiten etwas gefunden:

Tipp:Abfragefilter verfügen nicht über eine explizite Möglichkeit, nur einen Teil eines Zeichenfolgenwerts abzugleichen, aber Sie können mithilfe von Ungleichheitsfiltern eine Präfixübereinstimmung vortäuschen:

db.GqlQuery("SELECT * FROM MyModel WHERE prop >= :1 AND prop < :2",
            "abc",
            u"abc" + u"\ufffd")

Dies gleicht jede MyModel-Entität mit einer Zeichenfolgeneigenschaft ab, die mit den Zeichen abc beginnt.Die Unicode-Zeichenfolge u"\ufffd" stellt das größtmögliche Unicode-Zeichen dar.Wenn die Eigenschaftswerte in einem Index sortiert werden, sind die Werte, die in diesen Bereich fallen, alle Werte, die mit dem angegebenen Präfix beginnen.

http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html

vielleicht könnte das helfen ;)

Obwohl App Engine keine LIKE-Abfragen unterstützt, sehen Sie sich die Eigenschaften an ListProperty Und StringListProperty.Wenn ein Gleichheitstest für diese Eigenschaften durchgeführt wird, wird der Test tatsächlich auf alle Listenmitglieder angewendet, z. B. list_property = value testet, ob der Wert irgendwo in der Liste erscheint.

Manchmal kann diese Funktion als Workaround für das Fehlen von LIKE-Abfragen verwendet werden.Es macht es zum Beispiel möglich, dies zu tun einfache Textsuche, wie in diesem Beitrag beschrieben.

Sie müssen verwenden Suchdienst um Volltextsuchanfragen ähnlich wie SQL durchzuführen LIKE.

Gaelyk Bietet eine domänenspezifische Sprache für mehr Leistung benutzerfreundliche Suchanfragen.Im folgenden Snippet finden Sie beispielsweise die ersten zehn Bücher sortiert nach den neuesten, deren Titel Folgendes enthält: fernund das Genre genau passend thriller:

def documents = search.search {
    select all from books
    sort desc by published, SearchApiLimits.MINIMUM_DATE_VALUE
    where title =~ 'fern'
    and genre =  'thriller'
    limit 10
}

Like wird als Match-Operator von Groovy geschrieben =~.Es unterstützt Funktionen wie distance(geopoint(lat, lon), location) sowie.

Die App Engine wurde für allgemeine Zwecke eingeführt Volltextsuchdienst in Version 1.7.0, die den Datenspeicher unterstützt.

Details im Bekanntmachung.

Weitere Informationen zur Verwendung: https://cloud.google.com/appengine/training/fts_intro/lesson2

Schauen Sie sich Objectify an Hier , es ist wie eine Datastore-Zugriffs-API.Es gibt eine FAQ speziell zu dieser Frage, hier ist die Antwort

Wie führe ich eine Like-Abfrage durch (LIKE „foo%“)
Sie können so etwas wie „startWith“ oder „endWith“ tun, wenn Sie die Reihenfolge beim Speichern und Durchsuchen umkehren.Sie führen eine Bereichsabfrage mit dem gewünschten Startwert und einem Wert knapp über dem gewünschten Wert durch.

String start = "foo";
    ... = ofy.query(MyEntity.class).filter("field >=", start).filter("field <", start + "\uFFFD");

Folgen Sie einfach hier:init.py#354">http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/search/drin.py#354

Es klappt!

class Article(search.SearchableModel):
    text = db.TextProperty()
    ...

  article = Article(text=...)
  article.save()

To search the full text index, use the SearchableModel.all() method to get an
instance of SearchableModel.Query, which subclasses db.Query. Use its search()
method to provide a search query, in addition to any other filters or sort
orders, e.g.:

  query = article.all().search('a search query').filter(...).order(...)

Ich habe dies mit der Low-Level-Java-API von GAE Datastore getestet.Ich und funktioniert perfekt

    Query q = new Query(Directorio.class.getSimpleName());

    Filter filterNombreGreater = new FilterPredicate("nombre", FilterOperator.GREATER_THAN_OR_EQUAL, query);
    Filter filterNombreLess = new FilterPredicate("nombre", FilterOperator.LESS_THAN, query+"\uFFFD");
    Filter filterNombre =  CompositeFilterOperator.and(filterNombreGreater, filterNombreLess);

    q.setFilter(filter);

Auch wenn dies ein alter Beitrag ist, besteht eine Möglichkeit, ein „LIKE“ oder „ILIKE“ zu erzeugen, im Allgemeinen darin, alle Ergebnisse einer „>=“-Abfrage zu sammeln und dann die Ergebnisse in Python (oder Java) nach Elementen zu schleifen, die das enthalten, was Sie möchten Du suchst.

Angenommen, Sie möchten Benutzer mit einem q='luigi' filtern.

users = []
qry = self.user_model.query(ndb.OR(self.user_model.name >= q.lower(),self.user_model.email >= q.lower(),self.user_model.username >= q.lower()))

for _qry in qry:
 if q.lower() in _qry.name.lower() or q.lower() in _qry.email.lower() or q.lower() in _qry.username.lower():
      users.append(_qry)

Es ist nicht möglich, eine LIKE-Suche in der Datastore-App-Engine durchzuführen. Das Erstellen einer Arraylist würde jedoch ausreichen, wenn Sie nach einem Wort in einer Zeichenfolge suchen müssen.

@Index
    public ArrayList<String> searchName;

und dann im Index mit objektivieren zu suchen.

List<Profiles> list1 = ofy().load().type(Profiles.class).filter("searchName =",search).list();

Dadurch erhalten Sie eine Liste mit allen Elementen, die die Welt enthalten, die Sie bei der Suche ausgewählt haben

Wenn die LIKE '%text%' immer mit einem oder mehreren Wörtern verglichen wird (denken Sie an Permutationen) und sich Ihre Daten langsam ändern (langsam bedeutet, dass die Erstellung und Aktualisierung von Indizes weder preislich noch leistungsmäßig übermäßig teuer ist), kann dies bei Relation Index Entity (RIE) der Fall sein die Antwort.

Ja, Sie müssen eine zusätzliche Datenspeichereinheit erstellen und diese entsprechend füllen.Ja, es gibt einige Einschränkungen, die Sie umgehen müssen (eine davon ist die Beschränkung der Länge der Listeneigenschaft im GAE-Datenspeicher auf 5000).Aber die daraus resultierenden Suchanfragen sind blitzschnell.

Einzelheiten finden Sie in meiner RIE mit Java und Ojbectify Und RIE mit Python Beiträge.

„Gefällt mir“ wird oft als Ersatz für die Textsuche verwendet.Für die Textsuche ist die Verwendung möglich Whoosh-AppEngine.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top