擷取、刪除文件並重新建立 (更新) 文件的索引

Amy Unruh,2012 年 10 月
Google 開發人員關係

簡介

本課程為您介紹如何透過文件 ID 擷取文件、如何刪除索引中的文件,以及如何重新建立索引以更新現有文件。 本文列出的所有便利方法都出自範例應用程式的 docs.py 檔案。

課程目標

瞭解如何使用 Search API 擷取、刪除文件和重新建立文件的索引。

事前準備

學習本課程之前必須先瞭解 Python Search API 入門指南

我們也建議您採取下列措施:

透過文件 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.csvdata/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 的說明。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
App Engine 上的 Python