Como recuperar, excluir e reindexar (atualizar) documentos

Amy Unruh, out de 2012
Relações com desenvolvedores do Google

Introdução

Nesta lição, mostramos como recuperar um documento por meio do código, como excluir documentos de um índice e como atualizar um documento existente ao indexá-lo novamente. Todos os métodos de conveniência mostrados aqui são do arquivo docs.py do aplicativo de exemplo.

Objetivos

Saiba como recuperar, excluir e reindexar documentos usando a API Search.

Pré-requisitos

Ter participado da aula anterior a esta, Introdução à API Python Search

É preciso ter também:

Como recuperar um documento por código

Às vezes, pode ser necessário recuperar um documento pelo código em vez de usar uma consulta. No aplicativo de exemplo, isso surge no contexto da criação de avaliações do produto, em que uma nova análise aciona alguma contabilidade relacionada ao Datastore. Depois disso, o documento do produto relevante é atualizado com a nova classificação média.

Recupere um documento com o método Index.get e forneça o código do documento como o parâmetro 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)

Como excluir um documento de um índice

Para excluir um documento de um índice, transmita o código dele para o método delete do índice. Você também deve localizar qualquer exceção 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)

Exclua todos os documentos de um determinado índice usando o método get_range do índice. Para ter eficiência, defina o parâmetro ids_only como True, o que significa que os objetos do documento retornados contêm apenas os códigos deles e não os campos do documento, que você não precisa aqui. Exclua cada documento com base no código retornado:

@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:")

Observe que esse método faz um loop até não haver mais documentos no índice. Isso ocorre porque get_range retorna no máximo 1.000 documentos por vez (o limite padrão é 100). Portanto, várias chamadas podem ser necessárias para limpar todo o índice.

Como excluir um índice

É possível excluir um índice completamente ao remover primeiro todos os documentos no índice e depois o esquema do índice.

Reindexação do documento

Para atualizar ou alterar um documento indexado, basta adicionar um novo objeto de documento ao índice com o mesmo código de documento. Se o índice já contiver um documento com esse código, ele será atualizado e reindexado. Se não houver nenhum documento no índice com esse código, o novo documento será simplesmente adicionado com o código fornecido.

O aplicativo de exemplo usa IDs dos produtos derivados dos dados do produto de amostra, como os códigos de documento. Se você observar o código, perceberá que ele também usa os IDs do produto como códigos de entidade de Product no Datastore. Como os códigos dos documentos são idênticos aos IDs dos produtos, é fácil reindexar os dados do produto, caso eles sejam alterados. Como você recebe os IDs dos produtos da fonte de dados, é possível atualizar os documentos indexados sem precisar recuperá-los primeiro.

Para percorrer este processo, primeiro observe os arquivos data/sample_data_books.csv e data/sample_data_books_update.csv do aplicativo de exemplo. Eles contêm os dados do produto de amostra do aplicativo. Quando o usuário clica no link Excluir todos os dados do produto do armazenamento de dados e do índice e, em seguida, carregar os dados do produto de amostra, todos os dados em data/sample_data_books.csv são importados, primeiro excluindo qualquer conteúdo de índice. Para os fins desta discussão, a parte pertinente do processo é que, quando um novo documento é criado, o código é definido como o ID do produto:

d = search.Document(doc_id=product_id, fields=docfields)

O documento é então adicionado ao índice do produto.

Em seguida, se o usuário clicar em Demonstração do carregamento de dados de atualização do produto, os dados em data/sample_data_books_update.csv serão adicionados ao índice. Algumas das entradas nesse arquivo atualizam documentos de livros, uma vez que os IDs do produto deles correspondem a documentos. Outras entradas nesse arquivo definem novos livros (por definição), já que nenhum documento tem os IDs dos produtos.

Como você está usando os IDs dos produtos como códigos de documentos, é possível criar novos documentos a partir desses dados, definindo seus códigos de documentos para os IDs dos produtos, conforme acima, e simplesmente adicionar os documentos. Você não precisa saber se já existem documentos com esses IDs do produto. Se houver documentos com esses mesmos IDs do produto, eles serão atualizados com o novo conteúdo e reindexados. Caso contrário, novos documentos serão indexados.

Se você observar o código do aplicativo de exemplo, perceberá que essa não é toda a história: em algumas situações, há informações em um documento que você precisa reter e definir no documento atualizado. Portanto, nesses casos, você precisa acessar o documento antigo se ele existir.

Resumo e revisão

Nesta lição, você viu como recuperar documentos por código e como excluí-los e atualizá-los.

Esta lição conclui a Análise mais detalhada da classe da API Python Search. No decorrer desta aula e da precursora, você acumulou o kit de ferramentas básico para criar aplicativos que usam a API Search. Tente criar um aplicativo simples ou fazer modificações adicionais no aplicativo de exemplo!

É possível receber ajuda no Stack Overflow usando a tag google-app-engine ou no Grupo do Google App Engine.