2015-02-10 88 views
0

我正在使用Tom Walder's Google Datastore Library for PHP將數據插入到我的Google App Engine數據存儲中。如何構建數據存儲區索引(PHP GAE)

$obj_schema = (new GDS\Schema('Add Log')) 
    ->addString('name', TRUE) 
    ->addDatetime('time', TRUE); 
$obj_store = new GDS\Store($obj_gateway, $obj_schema); 
$obj_store->upsert($obj_store->createEntity(['name' => "test",'time' => date('Y-m-d H:i:s', time())])); 

當我像上面的代碼插入數據,似乎一切正常導入(每個屬性說,他們被索引)。

enter image description here

但是,當我去到做多選擇查詢它說:「你需要一個索引來執行這個查詢」。

我查詢 enter image description here

錯誤消息 enter image description here

有誰知道我需要做,以確保我的查詢正在索引?這就是我的儀表板在使用我所展示的代碼的大量數據時所顯示的內容。

enter image description here

+1

通常,爲您構建的索引是通過https://cloud.google.com/appengine/docs/python/config/indexconfig(即Python)在「index.yaml」中指定的,但我相信PHP方法非常相似 - 對不起,沒有PHP專家!)。在Python中,您通常會根據所需的所有查詢讓本地測試運行dev_appserver.py生成所需的index.yaml,然後上傳它 - 但最糟糕的情況是,您始終可以手動編輯並上傳* * 如果需要的話。 – 2015-02-10 05:31:24

回答

2

正如亞歷克斯·馬爾泰利在評論中提到,大部分的時間,你的索引,當你在devserver運行你的應用程序,讓您的數據存儲會被查詢有建(這需要更多的索引任何問題到您的index.yaml文件。

所以,你有兩種方法可以去它。

1-運行你的應用程序在本地devserver,去你的開發「Developer Console」,以一個或兩個實體添加到您的數據存儲。運行你的查詢,這將填充你的index.yaml需要索引。然後,您可以運行appcfg.py update_indexes剛剛部署index.yaml中(的this page底部)

2 - 你其他的解決辦法是閱讀this,在數據存儲,索引如何工作的一個頁面。然後閱讀this關於索引的高級文章。您還應該注意以下presentation,這將使您更好地瞭解索引和數據存儲。當這一切完成後,找出你想要的查詢,並在index.yaml充實所需的索引,然後用同樣的方法部署爲1

的指標是如何工作的

這麼快總結你可以將數據存儲視爲純粹的讀者。它不像正常的關係數據庫那樣在讀取數據並返回數據時進行任何計算。因此,爲了能夠運行一個給定的查詢(比如說「在2013年聖誕節前通過的所有客戶訂單」),那麼您需要一個表格,您的所有客戶訂單都按日期排序(因此係統不必檢查每一行的日期看看它是否匹配,它只需要你的數據的第一個「大塊」,直到你要找的日期,然後返回它。

因此,您需要建立這些索引,它們會影響您可以運行的查詢。默認情況下,每個屬性都按其自身索引,按降序排列。對於對多個屬性(或排序順序不同)的任何查詢,您需要擁有由數據存儲構建的索引(在這種情況下,它們被稱爲composite indexes),因此您需要在index.yaml中聲明它。

在過去的幾年中,Google添加了zigzag merge join algorithm,這基本上是一種採用2個複合索引(以相同屬性開始,因此在2個子查詢之間存在共同點)和運行2個子查詢然後讓算法加入兩個子查詢的響應。

+0

非常豐富,謝謝@Patrice花時間寫這篇文章。 – bryan 2015-02-12 16:27:52

+0

@Bryan我的榮幸:)。說實話,這不是第一次出現問題,這個答案就是值得的。我通常給較少的信息。今天,我決定爲索引編寫「be all all all」答案:P像這樣,我們終於可以在某處標記重複問題:p – Patrice 2015-02-12 17:15:24

+0

作爲FYI Toms庫正在使用雲數據存儲,因此您無法使用此處所述的技術(1)你需要自己編寫index.yaml文件。 – 2015-02-12 19:28:24