使用谷歌应用引擎索引营业时间
Posted
技术标签:
【中文标题】使用谷歌应用引擎索引营业时间【英文标题】:Indexing business hours using google app engine 【发布时间】:2012-03-09 17:30:30 【问题描述】:给定一天中的时间范围(营业时间),您如何创建一个索引来返回给定当前时间的实体。
我错误地假设仅包含营业时间和营业时间的列表属性可以在应用引擎上运行。以下失败,因为两个不等式过滤器必须匹配列表中的相同值:
Select * FROM Business WHERE hours < now AND hours > now
现在我有点投入,除了使用一长串时间之外没有解决方案,每 30 分钟切片一次,这似乎非常低效:
[900, 930, 1000, 1030, 1100, 1130, 1200, 1230, 1300, 1330, 1400, 1430, ... ]
有人知道散列打开和关闭时间或以其他方式解决此问题的巧妙方法吗?
【问题讨论】:
【参考方案1】:新答案: 我想了想,我认为您实际上已经在最初的想法中找到了解决方案。对于每个商家,都有一个 storehours ListProperty,它只存储商家营业的时间,就像您目前所做的那样。然后计算当前时间,四舍五入到最接近的半小时,所以12:50 -> 1200,然后查询
now = 1200
Select * FROM Business WHERE now in hours
我不确定正确的 GQL 查询语法,但肯定有一个“in”过滤器。
旧答案(请勿阅读): 我正在做类似的事情,除了“尝试不同的事情”之外,我真的没有解决方案。
首先,您需要存储打开和关闭时间。可以作为两个单独的字段,也可以将它们编码为一个字段,例如 9-5 的“09001700”,甚至“M09001700”。或者将两者散列成一个数字,我认为这不会有很大的不同,无论你怎么做。
然后是坏消息。我不是特别擅长数论,但我们在这里尝试做的是对两组线性数字(打开和关闭时间)进行编码,以便您可以对第三个数字进行线性 > 或 或
我也不认为你需要做两个查询,你只需要做一个关于营业时间的查询,然后过滤它们以查看哪些是关闭的。如果你
您不一定需要将两个大集合放在一起。您可以查询 now > opentime 的所有项目,并手动过滤结果以查找 now
我最终采用的可能对您有用的解决方案是根本不查询商店营业时间,而是查询将返回更有限数据集的内容,然后根据商店营业时间过滤返回的结果。例如,如果您的用户按位置搜索,根据位置查询您的商家,并按商店营业时间过滤生成的商家,则只向用户显示打开的商家。
【讨论】:
我实际上走的是使用 Expando 模型的路线,并创建了表示一周中每一天的动态布尔属性以及四舍五入到最接近 15 分钟的相应开放时间(是的,每个模型都有很多布尔属性) .这适用于一周中的一天,但超过了所有天的 200 个索引配额。 list 方法的问题在于,列表中的元素限制为 30 个,因为这些值基本上是作为后端单独查询的 OR'd 在一起的。我现在真的很困惑,很想更详细地讨论解决方案。 您从哪里获得 30 个元素的限制?每个实体的索引属性限制为 5000 个,列表中的每个元素都算作一个。如果您要搜索一个范围([900,930,1000] IN 小时),您可能会遇到麻烦,但在列表中搜索 1 次应该没问题(930 小时)。 啊,我误认为有关列表中的 IN 过滤器的文档限制为 30 个,这种情况实际上是相反的。 [链接] (code.google.com/appengine/docs/python/datastore/…)【参考方案2】:其中一个方法是为每个商家设置营业时间和关闭时间,并查看一天中的时间是否介于两者之间。
但是对于大表,由于索引,您可能必须执行两个单独的查询。一个查询查看时间是否大于 opentime,另一个查询是否小于 closetime。这将是两个索引。
不是一个理想的解决方案,但它可能比您尝试做的更有效。
【讨论】:
是的,大表也有只允许在一个属性上不等式的限制,因此我尝试使用列表。如果我可能需要查询 9000 条记录,那么在您的两个查询解决方案中,我将返回两个相当大的查询集,我必须在事后进行 AND。这实际上是成倍增加的,因为一个企业实际上可以在一天内拥有多个打开和关闭对。以上是关于使用谷歌应用引擎索引营业时间的主要内容,如果未能解决你的问题,请参考以下文章