2016-04-16 17 views
1

Ich habe es mit einer Immobilien-App zu tun. Ein Haus wird typische Eigenschaften wie Preis, Bett Zimmer, Bad Zimmer, SqFt, Los Größe etc. Benutzer wird nach Homes suchen und eine solche Abfrage erfordert mehrere Ungleichheitsfilter wie: Preis zwischen x und y, Räume größer als z, Badezimmer mehr als p ... usw.Google Datastore - Search Optimization Technique

Ich weiß, dass mehrere Ungleichheitsfilter nicht erlaubt sind. Ich möchte auch keine Filterung in meinem Code durchführen und/weil ich Cursor verwenden möchte.

so habe ich zwei Lösungen gefunden. Ich bin mir nicht sicher, ob diese richtig sind - also wundern Sie sich, wenn Gurus etwas Licht abwerfen können

Lösung 1: Ich werde die Werte jedes Attributs diskretisieren und sie in einem Listenfeld speichern, dann verwenden Sie IN. Zum Beispiel: Wenn es 3 Schlafzimmer gibt, anstatt Betten = 3 zu lagern, werde ich Betten = [1,2,3] lagern. Wenn ein Benutzer nun nach Häusern mit mindestens zwei Schlafzimmern sucht, dann schreibe ich den Filter nicht als Betten> 2, sondern schreibe den Filter als "Betten IN [2]" - und mein Zuhause über [1,2,3] wird qualifizieren - so wird auch jedes Haus mit 2 Betten [1,2] oder 4 Betten [1,2,3,4] und so weiter

Lösung 2: Es ist ähnlich dem ersten, aber anstatt eine zu erstellen list-property, ich werde dem Haus tatsächlich attributierte (Spalten) hinzufügen. So ein Haus mit 3 Schlafzimmern wird die folgenden zugeschrieben/Spalten/Eigenschaften: Col-Bed-1: True, Col-Bett-2: True, Col-Bed-3: True. Wenn nun ein Benutzer nach Häusern mit mindestens zwei Schlafzimmern sucht, dann schreibe ich den Filter nicht als Betten> 2, sondern schreibe den Filter als "col-bed-2 = true" - und mein Zuhause wird sich qualifizieren - so wird es auch sein Haus mit 2 Betten, 3 Betten, 4 Betten und so weiter

ich weiß, dass beide Lösungen funktionieren wird, aber ich möchte wissen: 1. Welche besser ist sowohl von einer Leistung und google Preis Perspektive 2. gibt es eine bessere Lösung, dies zu tun?

+0

Dies funktioniert nicht für den Preis, es sei denn, Sie begrenzen die Genauigkeit (sagen Sie alle $ 50, die Sie diskretisieren) –

Antwort

1

Ich mache fast genau Ihren Anwendungsfall mit einer Python gae App, die Beiträge mit Wohnungsanzeigen auflistet (ähnlich craigslist). Ich habe es in Python geschrieben und die Suche mit einem Filter funktioniert und unkompliziert.

sollten Sie eine Sprache wählen: Python, Java oder Go, und verwenden Sie dann die Google Search API (das für Gleichheiten oder Ungleichheiten integrierten Filter hat) und Datenspeicherindizes bauen, die Ihnen die Suche API abfragen verwenden.

Zum Beispiel können Sie eine Python-Klasse wie die folgende verwenden, um den Datenspeicher aufzufüllen und dann die Such-API zu verwenden.

class Home(db.Model): 
    address = db.StringProperty(verbose_name='address') 
    number_of_rooms = db.IntegerProperty() 
    size = db.FloatProperty() 
    added = db.DateTimeProperty(verbose_name='added', auto_now_add=True) # readonly 
    last_modified = db.DateTimeProperty(required=True, auto_now=True) 
    timestamp = db.DateTimeProperty(auto_now=True) # 
    image_url = db.URLProperty(); 

Ich denke auf jeden Fall, dass Sie Permutationen aus mehreren Gründen zu speichern vermeiden sollten: Permutationen in Größe explodieren kann und macht den Code schwer zu lesen. Stattdessen sollten Sie tun, was ich getan habe, und Beispiele finden, bei denen jemand anderes bereits ein gleiches oder ähnliches Problem gelöst hat.

This appengine demo könnte Ihnen helfen.

+1

Wie groß ist Ihr Datensatz? Da die Google Search-API mehrere Ungleichungsfilter integriert hat, frage ich mich, wie diese Leistung aussieht. –

+1

Meine Indizes sind etwa 1 GB und meine Daten sind etwa 1 GB + Blobs, die viele GB sind. Ich speichere Blobs im Blobstore und die Blobs nehmen den meisten Platz ein. Ok, die Suche ist nicht blitzschnell, aber es funktioniert gut. –