2011-02-25 78 views
3

我有一個Google App Engine應用程序與一個特定的模型,我們稱之爲遊戲。 它是指足球比賽,其日期,推薦人(參考),2個俱樂部(參考),得分,階段(參考),比賽(參考)和季節(參考)列表。換句話說,它有幾個領域,我打算通過高級搜索頁面進行搜索。例如,如果有人想按季節(比如說2008/2009)和日期(比如2009年1月1日之後)搜索所有遊戲,我應該解析GET變量,並且提出類似如下內容:Google App Engine綜合索引重新使用

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個實體?

  • 如果不是,有沒有更好的方法來解決這個問題?有一件事我打算做的是插入「空白」的過濾器,例如在一定的季節內遊戲搜索和俱樂部:

    遊戲= Game.all()
    //解析GET變量。 如果(variables.hasFilter( 「季節」)
    games.filter( 「game_season =」,季節) 其他 games.filter( 「game_season =」 *)

    如果(variables.hasFilter( 「日期」 )
    games.filter( 「GAME_DATE =」,日期) 其他 games.filter( 「GAME_DATE =」 *)

    如果(variables.hasFilter( 「俱樂部」)
    games.filter(「game_club = 「,俱樂部) 其他 比賽。過濾器(「game_club =」 *)

,因爲我認爲這是醜陋的我還沒有實現這個解決辦法,這意味着,它不是解決這個問題的最好辦法。 (另外,我仍然不知道如何實現通配符)。

感謝您對此問題的任何意見。

回答

4

由於App Engine數據存儲區是無模式的,因此後者的索引不能用於滿足前者的查詢,因爲它僅索引具有定義的全部三個屬性的實體。

插入'空'過濾器也不行,因爲它只會返回那些爲這些屬性設置空字符串的實體,而不是返回具有任何值的實體(這似乎是你想要的)。

一個選擇是依賴合併連接策略 - 只要沒有不等式過濾器或排序順序,沒有自定義索引,App Engine就可以使用任意數量的相等過濾器執行查詢。另一個選擇是使用一個StringListProperty,填充適用於該實體的所有「標誌」,並在列表上執行查詢。

+0

這說明了這個問題,但只是說這裏沒有優雅的解決方案。看起來我必須限制允許的高級搜索,爲固定複合索引設置預定義的過濾器組合。 – NunoCardoso 2011-03-01 08:51:00