我正在处理一个房地产应用程序。一个家庭将有典型的属性,如价格,卧室,浴室,SqFt,批量等用户将搜索房屋,这样的查询将需要多个不等式过滤器,如:价格在x和y之间,房间大于z,浴室超过p。等。
我知道多个不等式过滤器是不允许的。我也不想在我的代码中执行任何过滤,因为我希望能够使用游标。
因此,我提出了两个解决方案。我不确定这些是否是正确的,所以我想知道上师是否可以提供一些启发。
解决方案1:我将对每个属性的值进行离散化,并将它们保存在一个列表字段中,然后使用IN。例如:如果有3个卧室,我将存储beds=3 = 1,2,3,而不是存储床= 1,2,3。现在,如果用户搜索至少有两个卧室的房屋,那么我不会将过滤器写为beds>2,而是将过滤器写为"beds IN 2“-我的家在1,2,3之上将符合条件-任何具有2张床1,2或4张床1,2,3,4的家也将如此
解决方案2:它与第一个类似,但我不会创建list-property,而是将属性(列)添加到home中。因此,具有3个卧室的家庭将具有以下属性/列/属性: col- bed -1:true,col-bed 2:true,col-bed 3:true。现在,如果用户搜索至少有两个卧室的房屋,那么我将把过滤器写为“beds>2 -beds>2-2= true”,而不是将过滤器写为“col 2=true”-我的房屋将符合条件-任何具有2张床、3张床、4张床的房屋也将如此,依此类推
我知道这两种解决方案都会有效,但我想知道: 1.从性能和谷歌定价的角度来看,哪一种更好? 2.有没有更好的解决方案?
发布于 2016-04-17 08:23:52
我使用python gae应用程序几乎完全符合您的用例,该应用程序列出了带有房屋广告的帖子(类似于craigslist)。我用python写的,用过滤器进行搜索很有效,而且很简单。
您应该选择一种语言: Python、Java或Go,然后使用Google Search API (它具有内置的相等或不等式过滤功能)并构建可使用搜索API查询的数据存储索引。
例如,您可以使用如下所示的python类来填充数据存储,然后使用搜索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可能会对您有所帮助。
https://stackoverflow.com/questions/36668419
复制相似问题