Frage

Ich baue ein Verzeichnis für die Suche nach sportlichen Turnieren auf GAE mit web2py und eine Flex Frontend. Der Benutzer wählt einen Ort, einen Radius und eine maximale Datum aus einer Reihe von Optionen. Ich habe eine Basisversion dieser Abfrage implementiert, aber es ist ineffizient und langsam. Ein Weg, ich weiß, ich verbessern kann es durch Kondensation die viele einzelne Abfragen Ich verwende die Objekte zusammen in Massenabfragen. Ich habe gerade gelernt, dass möglich war. Aber ich bin auch über eine umfangreiche Neugestaltung denke, die memcache nutzt.

Das Hauptproblem ist, dass ich nicht auf den Datenspeicher nach Standort abfragen weil GAE nicht mehrere numerische Vergleich Aussagen erlauben (<, <=,> =,>) In einer Abfrage. Ich verwende bereits eine für Datum, und ich würde Notwendigkeit ZWEI sowohl geografische Breite und Länge zu überprüfen, so dass es ein no go ist. Zur Zeit, mein Algorithmus sieht wie folgt aus:

1.) Abfrage nach Datum und wählen Sie

2.) Verwenden Zielfunktion von geopy der Abstand Modul finden die max und min Breite und Längen für gelieferte Abstand

3.) Schleife durch Ergebnisse und entfernen Sie alle mit lat / lng außerhalb max / min

4.) Schleife wieder durch und Verwendung Abstandsfunktion zu überprüfen, genau Abstand, da Schritt 2 werden einige Bereiche außerhalb des Radius umfassen. Entfernen Ergebnisse außen zugeführt Abstand (das ist 2/3/4 Kombination ineffizient?)

5.) Montieren many-to-many-Listen und Listenobjekte (das ist, wo ich Notwendigkeit der Umstellung auf Bulk-Operationen)

6.) Zurück zum Client

Hier ist mein Plan memcache für die Verwendung .. lassen Sie mich wissen, ob ich Ausweg links bin auf diesem Feld als ich keine vorherige Erfahrung mit memcache oder Server Cachen im Allgemeinen.

-Halten eine Liste im Cache mit „Geo-Objekten“ gefüllt, die alle repräsentieren meine Daten. Diese haben fünf Eigenschaften: Breitengrad, Längengrad, event_id, event_type (in Erwartung über Turnieren expandieren), und Anfangsdatum. Diese Liste wird nach Datum sortiert werden.

-Auch ein dict von Zeigern im Cache halten, die den Anfang darstellen und End-Indizes in dem Cache für alle Datumsbereiche meines app verwendet (nächsten Woche, 2 Wochen, Monat, 3 Monate, 6 Monate, Jahr, 2 Jahre).

-Haben eine geplante Aufgabe, die die Zeiger täglich um 00.00 Uhr aktualisiert.

-Add neue Einsätze in den Cache sowie den Datenspeicher; aktualisieren Zeiger.

Mit diesem Entwurf würde der Algorithmus nun wie folgt aussehen:

1.) Verwenden Sie Zeiger auf slice off entsprechenden Batzen Liste basiert auf gelieferte Datum.

2-4.) Wie oben Algorithmus, außer mit Geo-Objekten

5.) Die Verwendung Massenvorgang auszuwählen vollständige Turniere verbleibenden geo mit Objekte event_ids

6.) Montieren many-to-manys

7.) Zurück zum Client

Gedanken zu diesem Ansatz? Vielen Dank für das Lesen und jeder Rat, den Sie geben kann.

-Dane

War es hilfreich?

Lösung

Sie könnten durch geohash interessiert sein, mit dem Sie eine Ungleichheit Abfrage wie dies zu tun ermöglicht:

  

SELECT Breitengrad, Längengrad, Titel FROM   myMarkers WHERE geohash> =: sw_geohash   UND geohash <=: ne_geohash

Haben Sie einen Blick auf dieser feinen Artikel , die in diesem Monat des Google App Engine App Engine Community Update Blog-Post.

Als Hinweis auf Ihrem vorgeschlagenen Entwurf, vergessen Sie nicht, dass Unternehmen in Memcache haben keine Garantie für in Erinnerung bleiben, und dass man sie nicht haben „nach dem Datum sortiert“.

Andere Tipps

GeoModel ist die beste fand ich. Sie können sehen, wie meine GAE App Rückkehr geospatial Abfragen. Zum Beispiel Indien http Abfrage ist mit optional cc (Ländercode) Geomodells Bibliothek mit lat=20.2095231&lon=79.560344&cc=IN

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