2016-04-16 49 views
1

我正在處理房地產應用程序。房屋將具有典型的屬性,如價格,牀房,浴室,SqFt,地塊面積等。用戶將搜索房屋,這樣的查詢將需要多個不平等過濾器,如:x和y之間的價格,大於z的房間,浴室更多比p ...等谷歌數據存儲 - 搜索優化技術

我知道多個不等式過濾器是不允許的。我也不想在我的代碼中執行任何過濾,因爲我希望能夠使用遊標。

所以我想出了兩個解決方案。我不確定這些是否正確 - 所以不知道大師是否可以解決一些問題

解決方案1:我將離散每個屬性的值並將它們保存在列表字段中,然後使用IN。例如:如果有3個臥室,而不是儲存牀= 3,我會儲存牀= [1,2,3]。現在,如果用戶搜索至少有兩間臥室的房屋,那麼我不會將過濾器寫成牀> 2,而是將過濾器寫成「牀在[2]」 - 而我的家在[1,2,3]將符合條件 - 任何有兩張牀[1,2]或四張牀[1,2,3,4]的住宅等等

解決方案2:它與第一個類似,但不是創建列表屬性,我實際上將歸因(列)添加到家中。因此,有3間臥室的房屋將具有以下屬性/柱/屬性:col-bed-1:true,col-bed-2:true,col-bed-3:true。現在,如果用戶搜索至少有兩間臥室的房屋,那麼不要將過濾器寫成牀> 2,我會將過濾器寫爲「col-bed-2 = true」 - 我的家將符合條件 - 任何家裏有兩張牀,3張病牀,4牀等

我知道這兩種解決方案將工作,但我想知道: 1.哪一個是好無論從性能和谷歌定價的角度 2.是否有更好的解決方案來做到這一點?

+0

除非您限制精度(比如說每隔50美元離散),否則這將不適用於價格 –

回答

1

我幾乎完全用python gae應用程序的用例來列出包含房屋廣告(類似craigslist)的帖子。我用python編寫它,並用篩選器搜索正在工作和直接。

您應該選擇一種語言:Python,Java或Go,然後使用Google Search API(它具有用於平等或不等式的內置過濾),並構建可使用搜索API查詢的數據存儲區索引。

例如,您可以使用像下面這樣的python類來填充數據存儲區,然後使用Search API。

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(); 

我絕對認爲你應該避免存儲排列有以下幾個原因:排列組合可以在大小爆炸,使代碼難以閱讀。相反,你應該像我一樣做,並找到其他人已經解決了相同或類似問題的例子。

This appengine demo可能會幫助你。

+1

您的數據集有多大?由於Google Search API內置了多個不相等的過濾器,我不知道它的表現如何。 –

+1

我的索引大約是1 GB,我的數據大約是1 GB +大量GB的blob。我將blob存儲在blobstore中,blob佔用最多的空間。好吧,搜索不是閃電般的,但它運作良好。 –