Récupérer, supprimer et réindexer (mettre à jour) des documents

Amy Unruh, octobre 2012
Relations Google Developer

Présentation

Cette leçon explique comment récupérer un document grâce à son ID de document, comment supprimer des documents d'un index et comment mettre à jour un document existant en le réindexant. Toutes les méthodes pratiques présentées ici proviennent du fichier docs.py de l'application utilisée en exemple.

Objectifs

Découvrez comment récupérer, supprimer et réindexer des documents à l'aide de l'API Search.

Prérequis

Avoir suivi le cours qui précède celui-ci : Premiers pas avec l'API Python Search.

Nous recommandons également :

Récupérer un document grâce à son ID de document

Plutôt que d'utiliser une requête, vous aurez parfois besoin de récupérer un document grâce à son ID de document. Dans l'exemple d'application, cela peut s'avérer nécessaire lors de la création d'un avis sur le produit. Dans ce cas, un nouvel avis entraîne des activités comptables pour Datastore, après quoi la note moyenne du produit en question est mise à jour dans le document.

Vous pouvez récupérer un document avec la méthode Index.get et fournir l'ID de document via le paramètre 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)

Supprimer un document d'un index

Pour supprimer un document d'un index, transmettez son ID à la méthode delete de l'index. Vous devez également intercepter les exceptions 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)

Vous pouvez supprimer tous les documents d'un index donné à l'aide de la méthode get_range de cet index. Pour plus d'efficacité, définissez le paramètre ids_only sur True pour indiquer que les objets de document renvoyés contiennent uniquement leurs ID et non les champs de document dont vous n'avez pas besoin dans le cas présent. Supprimez chaque document selon l'ID qui a été renvoyé :

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

Notez que cette méthode se répète en boucle jusqu'à ce qu'il n'y ait plus aucun document dans l'index. En effet, get_range ne renvoie que 1 000 documents à la fois tout au plus (la limite par défaut est de 100). Par conséquent, plusieurs appels peuvent être nécessaires pour effacer l'intégralité de l'index.

Supprimer un index

Vous pouvez supprimer un index entièrement en supprimant tous les documents qu'il contient, puis en supprimant le schéma de l'index.

Réindexer des documents

Pour mettre à jour ou modifier un document indexé, ajoutez simplement un nouvel objet de document à l'index en réutilisant le même ID de document. Si l'index contient déjà un document portant cet ID, le document existant sera mis à jour et réindexé. En revanche, si aucun document n'existe déjà dans l'index avec cet ID, le nouveau document est simplement ajouté avec l'ID donné.

L'exemple d'application utilise les ID de produit contenus dans les exemples de données de produit comme ID de document. (Si vous regardez le code, vous remarquerez qu'il utilise également les ID de produit en tant qu'ID d'entité Product dans le Datastore). Les ID de document étant identiques à ceux du produit, il est facile de réindexer les données du produit si elles changent. Et comme vous obtenez les ID de produit de la source de données, vous pouvez mettre à jour les documents indexés sans avoir à les récupérer au préalable.

Pour suivre ce processus, commencez par examiner les fichiers data/sample_data_books.csv et data/sample_data_books_update.csv de l’exemple d’application. Ils contiennent les exemples de données produit de l'application. Lorsque l'utilisateur clique sur le lien Supprimer toutes les données du datastore et du produit d'index, puis charger des exemples de données de produit, le contenu d'index existant est supprimé et toutes les données du fichier data/sample_data_books.csv sont ensuite importées. Dans notre cas, nous nous intéressons au fait que lorsqu'un document est créé, son ID est défini sur l'ID du produit :

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

Le document est ensuite ajouté à l'index de produit.

Si l'utilisateur clique ensuite sur Démonstration du chargement des données de mise à jour du produit, les données contenues dans le fichier data/sample_data_books_update.csv sont ajoutées à l'index. Certaines entrées de ce fichier mettent à jour des documents de livre existants, car leur ID de produit correspond à des documents existants. D'autres entrées de ce fichier définissent de nouveaux livres, par définition, car aucun document existant n'a le même ID de produit.

Puisque vous utilisez les ID de produit comme ID de document, vous pouvez créer des documents à partir de ces données. Pour cela, définissez leur ID de document sur les ID de produit comme ci-dessus et ajoutez simplement les documents. Vous n'avez pas besoin de savoir s'il existe déjà des documents portant ces ID de produit. Si des documents portant les mêmes ID de produit existent, ils seront mis à jour avec le nouveau contenu, puis réindexés. Sinon, l'indexation sera effectuée sur les nouveaux documents.

Si vous regardez le code de l'exemple d'application, vous remarquerez cependant que l'histoire ne s'arrête pas là : dans certains cas, un document existant contient des informations que vous devez conserver et définir dans le document mis à jour. Dans ce cas, vous aurez donc besoin d'accéder à l'ancien document s'il existe.

Résumé et vérification

Dans cette leçon, vous avez vu comment récupérer des documents grâce à leur ID de document, et comment les supprimer et les mettre à jour.

Cette leçon conclut le cours Explications détaillées sur l'API Python Search. Dans ce cours et dans celui qui le précède, vous avez acquis les notions de base vous permettant de créer des applications utilisant l'API Search. Essayez de créer une application simple vous-même ou d'apporter des modifications supplémentaires à l'exemple d'application sur lequel nous venons de travailler.

Pour obtenir de l'aide sur Stack Overflow, utilisez le tag google-app-engine ou consultez le groupe Google App Engine.

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Python sur App Engine