Google 開發人員關係
簡介
本課程為您介紹如何透過文件 ID 擷取文件、如何刪除索引中的文件,以及如何重新建立索引以更新現有文件。
本文列出的所有便利方法都出自範例應用程式的 docs.py
檔案。
課程目標
瞭解如何使用 Search API 擷取、刪除文件和重新建立文件的索引。
事前準備
學習本課程之前必須先瞭解 Python Search API 入門指南
我們也建議您採取下列措施:
- 瞭解 Python 2.7 和 Python 專用的 Google App Engine SDK
- 熟悉 Python 與 App Engine 應用程式的基本概念
透過文件 ID 擷取文件
有時候您可能需要透過文件 ID 擷取文件,而非使用查詢擷取文件。在範例應用程式中,我們提供了一個建立產品評論的環境,在此環境中,新評論會觸發某些 Datastore 相關的簿記動作,之後相關產品文件會更新平均評分。
您可以使用 Index.get
方法擷取文件,並提供文件 ID 做為 doc_id
參數:
@classmethod
def getDoc(cls, doc_id):
"""Return the document with the given doc id."""
index = cls.getIndex()
return index.get(doc_id=doc_id)
刪除索引中的文件
如要刪除索引中的文件,請將文件 ID 傳送至索引的 delete
方法。您也應捕捉任何 DeleteError
例外狀況。
@classmethod
def deleteDocById(cls, doc_id):
"""Delete the doc with the given doc id."""
try:
cls.getIndex().delete(doc_id)
except search.DeleteError:
logging.exception("Error removing doc id %s.", doc_id)
您可以使用索引的 get_range
方法刪除特定索引中的所有文件。為了提高效率,請將 ids_only
參數設定為 True
,這表示傳回的文件物件只包含文件 ID,不包含文件欄位,而且您在這裡也不需要文件欄位。根據傳回的 ID 刪除每個文件:
@classmethod
def deleteAllInIndex(cls):
"""Delete all the docs in the given index."""
docindex = cls.getIndex()
try:
while True:
# until no more documents, get a list of documents,
# constraining the returned objects to contain only the doc ids,
# extract the doc ids, and delete the docs.
document_ids = [document.doc_id for document in docindex.get_range(ids_only=True)]
if not document_ids:
break
docindex.delete(document_ids)
except search.DeleteError:
logging.exception("Error removing documents:")
請注意,這個方法會不斷重複,直到索引中沒有更多文件為止。這是因為 get_range
一次最多只能傳回 1000 個文件 (預設限制為 100),因此如要清除完整索引,可能需要執行多次呼叫。
刪除索引
您可以刪除索引中的所有文件,然後刪除索引結構定義,藉此徹底刪除索引。
重新建立文件索引
如要更新或變更已編入索引的文件,請將文件 ID 相同的新文件物件新增至索引。如果索引中包含該 ID 的文件,系統將會更新現有文件並重新建立索引;如果索引中不存在該 ID 的文件,則會直接新增該特定 ID 的新文件。
範例應用程式使用範例產品資料中的產品 ID 做為文件 ID。(如果您查看程式碼,會發現程式碼也使用產品 ID 做為 Datastore 中的 Product
實體 ID)。由於文件 ID 與產品 ID相同,因此如果產品資料發生變化,重新建立索引是很容易的。由於您會從資料來源取得產品 ID,因此不需要先擷取產品 ID,即可更新編入索引的文件。
為了逐步說明這個程序,請先查看範例應用程式中的 data/sample_data_books.csv
與 data/sample_data_books_update.csv
檔案。這些檔案中包含應用程式的範例產品資料。當使用者按一下 [Delete all datastore and index product data, then load in sample product data] (刪除所有資料儲存庫與索引產品資料,然後載入範例產品資料) 連結時,系統會匯入 data/sample_data_books.csv
中的所有資料,並先刪除任何現有的索引內容。就本討論的目的而言,這個程序的關鍵點在於建立新文件時,文件 ID 會設定為產品 ID:
d = search.Document(doc_id=product_id, fields=docfields)
然後文件會新增至產品索引。
接下來,如果使用者按一下 [Demo loading product update data] (示範載入產品更新資料),data/sample_data_books_update.csv
中的資料會新增至索引。此檔案中的某些項目會更新現有書籍文件,因為這些項目的產品 ID 對應於現有文件。此檔案中的其他項目會藉由定義來定義新書籍,因為所有現有文件都沒有產品 ID。
由於您正使用產品 ID 做為文件 ID,因此可以透過此資料建立新文件、如上所述將文件 ID 設定為產品 ID,並直接新增文件。您不需要知道這些產品 ID 的文件是否存在。如果這些相同產品 ID 的文件確實存在,這些文件將會更新為新內容並重新建立索引;如否,則會將新文件編入索引。
如果您查看範例應用程式程式碼,會發現這並非全貌:在某些情況下,您會需要在更新的文件中保留及設定現有文件中的資訊,所以在這些情況下,您並不需要存取舊文件 (如果存在舊文件)。
摘要與回顧
在本課程中,您學會了如何透過文件 ID 擷取文件,以及如何刪除及更新文件。
本課程包含「深入瞭解 Python Search API」課程。在本課程與其先修課程中,您已累積了建構應用程式的基本工具包,而這些應用程式都使用 Search API。請嘗試建立自己的簡單應用程式,或對範例應用程式進行額外的修改!
您可以使用 google-app- engine 標記,或在 App Engine Google 網上論壇取得有關 Stack Overflow 的說明。