Google app engine googleappengine复合索引重用

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

我有一个特定型号的谷歌应用程序引擎,我们称之为游戏。 它指的是一场足球比赛,它的日期,参考(参考),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
现在,如果有人想要搜索赛季、日期和俱乐部,它甚至需要另一个综合索引:

- 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,填充应用于实体的所有“标志”,并对列表执行查询。

对这个问题有了一些了解,但只是说这里没有优雅的解决方案。看起来我必须限制允许的高级搜索,为固定的复合索引设置预定义的过滤器组合。