我有一个带有特定型号的Google App Engine应用程序,我们称之为游戏。 它指的是足球比赛,其日期,推荐人(参考),2个俱乐部(参考)的列表,得分,其阶段(参考),比赛(参考)和赛季(参考)。换句话说,它有几个字段,我打算通过高级搜索页面进行搜索。
例如,如果有人想要按季节搜索所有游戏(例如:2008/2009)和按日期(比如2009年1月1日之后),我应该解析GET变量并提出类似的结果:
games = Game.all()
// parse GET variables.
if (variables.hasFilter("season")
games.filter("game_season = ", season)
if (variables.hasFilter("after_date")
games.filter("game_date > ", after_date)
它需要特定的综合指数:
- kind: Game
properties:
- name: game_season
- name: game_date
现在,如果有人想要搜索季节和俱乐部,它将与上面相同,除了它需要另一个综合索引:
- kind: Game
properties:
- name: game_season
- name: game_club
现在,如果有人想要搜索季节,日期和俱乐部,它甚至需要另一个复合索引:
- kind: Game
properties:
- name: game_season
- name: game_date
- name: game_club
我的问题是:如果我准备好第三个索引并提供查询,我可以删除两个第一个索引,因为它可以用于提供上述三个高级搜索,或者Google App Engine会生成NeedIndexError,因为它没有我不知道如何重用第三个索引来提供前两个高级搜索?
问题是我想为几个领域创建一个高级搜索(例如6 - 日期,赛季,比赛,俱乐部,阶段,得分)。这将需要具有两个实体的索引的组合,具有3个实体的索引的组合等,直到组合所有实体的最终索引。
问题:
GAE能否真正重用复合索引,以便通过生成6个实体的复合索引,我不必为5,4,3和2个实体生成该索引的更简单版本?
如果没有,有没有更好的方法来解决这个问题?我打算做的一件事就是插入“空白”过滤器,例如搜索某个季节内的游戏和俱乐部:
games = Game.all()
//解析GET变量。
if(variables.hasFilter(“season”)
games.filter(“game_season =”,季节)
其他
games.filter(“game_season =”*)
if(variables.hasFilter(“date”)
games.filter(“game_date =”,date)
其他
games.filter(“game_date =”*)
if(variables.hasFilter(“club”)
games.filter(“game_club =”,club)
其他
games.filter(“game_club =”*)
我没有实现这种解决方法,因为我觉得它很难看,这意味着它不是处理这个问题的最佳方法。 (另外,我还是不知道如何实现通配符)。
感谢您对此问题的任何意见。
答案 0 :(得分:4)
由于App Engine数据存储区是无模式的,后一个索引不能用于满足前者的查询,因为它仅索引定义了所有三个属性的实体。
插入“空”过滤器也不起作用,因为它只会返回为这些属性设置空字符串的实体,而不是返回具有任何值的实体(这似乎是你想要的)。
一种选择是依赖合并连接策略 - 只要没有不等式过滤器或排序顺序,App Engine就可以使用任意数量的相等过滤器执行查询,而不需要自定义索引。另一种选择是使用StringListProperty,填充所有适用于该实体的'flags',并对列表执行查询。