Wirklich einfach. Wenn ich in SQL ein Textfeld nach mehreren Zeichen durchsuchen möchte, kann ich Folgendes tun:
SELECT blah FROM blah WHERE blah LIKE '%text%'
In der Dokumentation zu App Engine wird nicht erwähnt, wie dies erreicht werden kann, aber es ist sicherlich ein häufig genug auftretendes Problem.
google-app-engine
google-cloud-datastore
gql
littlecharva
quelle
quelle
Antworten:
BigTable, das Datenbank-Backend für App Engine, wird auf Millionen von Datensätzen skaliert. Aus diesem Grund können Sie mit App Engine keine Abfragen durchführen, die zu einem Tabellenscan führen, da die Leistung für eine gut bestückte Tabelle schrecklich wäre.
Mit anderen Worten, jede Abfrage muss einen Index verwenden. Aus diesem Grund können Sie nur tun
=
,>
und<
Abfragen. (Tatsächlich können Sie dies auch tun,!=
aber die API tut dies mit einer Kombination aus>
und<
Abfragen durch.) Aus diesem Grund überwacht die Entwicklungsumgebung alle von Ihnen ausgeführten Abfragen und fügt Ihren fehlenden Indizes automatisch alle fehlenden Indizes hinzuindex.yaml
Datei .Es gibt keine Möglichkeit, für a zu indizieren
LIKE
Abfrage daher ist sie einfach nicht verfügbar.Sehen Sie sich diese Google IO-Sitzung an, um eine viel bessere und detailliertere Erklärung zu erhalten.
quelle
Ich habe das gleiche Problem, aber ich habe etwas auf den Seiten der Google App Engine gefunden:
Tipp: Abfragefilter haben keine explizite Möglichkeit, nur einen Teil eines Zeichenfolgenwerts abzugleichen. Sie können jedoch eine Präfixübereinstimmung mithilfe von Ungleichheitsfiltern vortäuschen:
Dies ordnet jeder MyModel-Entität eine Zeichenfolge-Eigenschaft zu, die mit den Zeichen abc beginnt. Die Unicode-Zeichenfolge u "\ ufffd" repräsentiert das größtmögliche Unicode-Zeichen. Wenn die Eigenschaftswerte in einem Index sortiert sind, 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 den Trick machen;)
quelle
Obwohl App Engine keine LIKE-Abfragen unterstützt, sehen Sie sich die Eigenschaften ListProperty und StringListProperty an . Wenn ein Gleichheitstest für diese Eigenschaften durchgeführt wird, wird der Test tatsächlich auf alle Listenmitglieder angewendet, z.
list_property = value
Tests, ob der Wert an einer beliebigen Stelle in der Liste angezeigt wird.Manchmal kann diese Funktion als Problemumgehung für das Fehlen von LIKE-Abfragen verwendet werden. Zum Beispiel ermöglicht es die einfache Textsuche, wie in diesem Beitrag beschrieben .
quelle
Sie müssen den Suchdienst verwenden , um Volltextsuchabfragen ähnlich wie bei SQL durchzuführen
LIKE
.Gaelyk bietet eine domänenspezifische Sprache, um benutzerfreundlichere Suchanfragen durchzuführen . Im folgenden Snippet finden Sie beispielsweise die ersten zehn Bücher, die nach den neuesten Büchern sortiert sind, deren Titel
fern
und das Genre genau übereinstimmenthriller
:Like ist als Groovys Match-Operator geschrieben
=~
. Es unterstützt auch Funktionen wiedistance(geopoint(lat, lon), location)
.quelle
Die App Engine hat in Version 1.7.0 einen allgemeinen Volltextsuchdienst gestartet , der den Datenspeicher unterstützt.
Details in der Ankündigung .
Weitere Informationen zur Verwendung: https://cloud.google.com/appengine/training/fts_intro/lesson2
quelle
Schauen Sie sich Objectify hier an , es ist wie eine Datenspeicher-Zugriffs-API. Es gibt eine FAQ mit dieser Frage speziell, hier ist die Antwort
quelle
Folgen Sie einfach hier: init.py # 354 "> http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/search/ init .py # 354
Es klappt!
quelle
Ich habe dies mit der Java-API von GAE Datastore auf niedriger Ebene getestet. Ich und funktioniert perfekt
quelle
Obwohl dies ein alter Beitrag ist, besteht eine Möglichkeit, ein 'LIKE' oder 'ILIKE' zu erstellen, darin, alle Ergebnisse aus einer '> =' - Abfrage zu sammeln und dann die Ergebnisse in Python (oder Java) für Elemente zu schleifen, die das enthalten, was Sie enthalten suchen.
Angenommen, Sie möchten Benutzer mit aq = 'luigi' filtern.
quelle
Es ist nicht möglich, eine LIKE-Suche in der Datenspeicher-App-Engine durchzuführen. Wie auch immer, das Erstellen einer Arrayliste würde den Trick tun, wenn Sie ein Wort in einer Zeichenfolge suchen müssen.
und dann mit objectify im Index zu suchen.
Auf diese Weise erhalten Sie eine Liste mit allen Elementen, die die Welt enthalten, die Sie bei der Suche erstellt haben
quelle
Wenn das
LIKE '%text%'
immer mit einem Wort oder ein paar verglichen wird (denken Sie an Permutationen) und sich Ihre Daten langsam ändern (langsam bedeutet dies, dass das Erstellen und Aktualisieren von Indizes sowohl preislich als auch leistungsmäßig nicht unerschwinglich teuer ist), dann Relation Index Entity (RIE) kann die Antwort sein.Ja, Sie müssen eine zusätzliche Datenspeicherentität erstellen und diese entsprechend füllen. Ja, es gibt einige Einschränkungen, die Sie umgehen müssen (eine ist die Beschränkung der Länge der Listeneigenschaft im GAE-Datenspeicher auf 5000). Die daraus resultierenden Suchanfragen sind jedoch blitzschnell.
Für Details siehe meine RIE mit Java und Ojbectify und RIE mit Python- Posts.
quelle
"Gefällt mir" wird oft als Ersatz für die Textsuche als armer Mann verwendet. Für die Textsuche kann Whoosh-AppEngine verwendet werden .
quelle