Google app engine googleappengine复合索引重用
我有一个特定型号的谷歌应用程序引擎,我们称之为游戏。 它指的是一场足球比赛,它的日期,参考(参考),2个俱乐部的列表(参考),分数,它的阶段(参考),比赛(参考)和季节(参考)。换句话说,它有几个字段,我打算通过高级搜索页面进行搜索 例如,如果有人想按赛季(比如2008/2009)和日期(比如2009年1月1日之后)搜索所有比赛,我应该解析GET变量并得出如下结果:Google app engine googleappengine复合索引重用,google-app-engine,indexing,Google App Engine,Indexing,我有一个特定型号的谷歌应用程序引擎,我们称之为游戏。 它指的是一场足球比赛,它的日期,参考(参考),2个俱乐部的列表(参考),分数,它的阶段(参考),比赛(参考)和季节(参考)。换句话说,它有几个字段,我打算通过高级搜索页面进行搜索 例如,如果有人想按赛季(比如2008/2009)和日期(比如2009年1月1日之后)搜索所有比赛,我应该解析GET变量并得出如下结果: games = Game.all() // parse GET variables. if (variables.hasF
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
现在,如果有人想要搜索赛季、日期和俱乐部,它甚至需要另一个综合索引:
- kind: Game
properties:
- name: game_season
- name: game_club
- kind: Game
properties:
- name: game_season
- name: game_date
- name: game_club
我的问题是:如果我准备好了第三个索引并为查询服务,我可以删除前两个索引吗?因为它可以用于上述三个高级搜索,或者Google App Engine是否会生成NeedIndexer,因为它不知道如何重用第三个索引来为前两个高级搜索服务
问题是,我想创建几个字段的高级搜索(比如6-日期、季节、比赛、俱乐部、阶段、分数)。这将需要索引与两个实体的组合,索引与3个实体的组合,等等,直到最终索引合并所有实体
问题:
- GAE真的可以重用复合索引吗?比如说,通过为6个实体生成复合索引,我就不必为5、4、3和2个实体生成该索引的更简单版本了
- 如果没有,有没有更好的方法来解决这个问题?我计划做的一件事是插入“空白”过滤器,例如在搜索特定赛季和俱乐部的比赛时:
games=Game.all()
//解析获取变量。 if(variables.hasFilter(“季节”)
games.filter(“game_season=,season”) 其他的 games.filter(“game\u seasure=“*) if(variables.hasFilter(“日期”)
games.filter(“game_date=”,date) 其他的 games.filter(“games_date=“*) 如果(变量hasFilter(“俱乐部”)
games.filter(“game_club=”,club) 其他的 games.filter(“game_club=“*)
感谢您对这个问题的任何意见。因为App Engine数据存储是无模式的,所以后一个索引不能用于满足前一个索引的查询,因为它只索引定义了所有三个属性的实体 插入“empty”过滤器也不会起作用,因为它只会返回为这些属性设置了空字符串的实体,而不会返回具有任何值的实体(这似乎是您想要的)
一个选项是依赖合并联接策略-只要没有不等筛选器或排序顺序,应用引擎可以使用任意数量的相等筛选器执行查询,而无需自定义索引。另一个选项是使用StringListProperty,填充应用于实体的所有“标志”,并对列表执行查询。对这个问题有了一些了解,但只是说这里没有优雅的解决方案。看起来我必须限制允许的高级搜索,为固定的复合索引设置预定义的过滤器组合。