Elasticsearch - API de document

Elasticsearch fournit des API de document unique et des API multi-documents, dans lesquelles l'appel d'API cible un seul document et plusieurs documents respectivement.

API d'index

Il est utile d'ajouter ou de mettre à jour le document JSON dans un index lorsqu'une demande est faite à cet index respectif avec un mappage spécifique. Par exemple, la demande suivante ajoutera l'objet JSON aux écoles d'index et sous le mappage scolaire -

PUT schools/_doc/5
{
   name":"City School", "description":"ICSE", "street":"West End",
   "city":"Meerut",
   "state":"UP", "zip":"250002", "location":[28.9926174, 77.692485],
   "fees":3500,
   "tags":["fully computerized"], "rating":"4.5"
}

En exécutant le code ci-dessus, nous obtenons le résultat suivant -

{
   "_index" : "schools",
   "_type" : "_doc",
   "_id" : "5",
   "_version" : 1,
   "result" : "created",
   "_shards" : {
      "total" : 2,
      "successful" : 1,
      "failed" : 0
   },
   "_seq_no" : 2,
   "_primary_term" : 1
}

Création d'index automatique

Lorsqu'une demande est faite pour ajouter un objet JSON à un index particulier et si cet index n'existe pas, cette API crée automatiquement cet index ainsi que le mappage sous-jacent pour cet objet JSON particulier. Cette fonctionnalité peut être désactivée en modifiant les valeurs des paramètres suivants sur false, qui sont présents dans le fichier elasticsearch.yml.

action.auto_create_index:false
index.mapper.dynamic:false

Vous pouvez également restreindre la création automatique d'index, où seul le nom d'index avec des modèles spécifiques est autorisé en modifiant la valeur du paramètre suivant -

action.auto_create_index:+acc*,-bank*

Note - Ici + indique autorisé et - indique non autorisé.

Gestion des versions

Elasticsearch fournit également une fonction de contrôle de version. Nous pouvons utiliser un paramètre de requête de version pour spécifier la version d'un document particulier.

PUT schools/_doc/5?version=7&version_type=external
{
   "name":"Central School", "description":"CBSE Affiliation", "street":"Nagan",
   "city":"paprola", "state":"HP", "zip":"176115", "location":[31.8955385, 76.8380405],
   "fees":2200, "tags":["Senior Secondary", "beautiful campus"], "rating":"3.3"
}

En exécutant le code ci-dessus, nous obtenons le résultat suivant -

{
   "_index" : "schools",
   "_type" : "_doc",
   "_id" : "5",
   "_version" : 7,
   "result" : "updated",
   "_shards" : {
      "total" : 2,
      "successful" : 1,
      "failed" : 0
   },
   "_seq_no" : 3,
   "_primary_term" : 1
}

Le contrôle de version est un processus en temps réel et il n'est pas affecté par les opérations de recherche en temps réel.

Il existe deux types de contrôle de version les plus importants:

Versionnage interne

Le contrôle de version interne est la version par défaut qui commence par 1 et s'incrémente à chaque mise à jour, suppressions incluses.

Versionnage externe

Il est utilisé lorsque la gestion des versions des documents est stockée dans un système externe comme les systèmes de gestion des versions tiers. Pour activer cette fonctionnalité, nous devons définir version_type sur external. Ici, Elasticsearch stockera le numéro de version comme indiqué par le système externe et ne les incrémentera pas automatiquement.

Type d'opération

Le type d'opération est utilisé pour forcer une opération de création. Cela permet d'éviter l'écrasement du document existant.

PUT chapter/_doc/1?op_type=create
{
   "Text":"this is chapter one"
}

En exécutant le code ci-dessus, nous obtenons le résultat suivant -

{
   "_index" : "chapter",
   "_type" : "_doc",
   "_id" : "1",
   "_version" : 1,
   "result" : "created",
   "_shards" : {
      "total" : 2,
      "successful" : 1,
      "failed" : 0
   },
   "_seq_no" : 0,
   "_primary_term" : 1
}

Génération automatique d'ID

Lorsque l'ID n'est pas spécifié dans l'opération d'index, Elasticsearch génère automatiquement l'ID pour ce document.

POST chapter/_doc/
{
   "user" : "tpoint",
   "post_date" : "2018-12-25T14:12:12",
   "message" : "Elasticsearch Tutorial"
}

En exécutant le code ci-dessus, nous obtenons le résultat suivant -

{
   "_index" : "chapter",
   "_type" : "_doc",
   "_id" : "PVghWGoB7LiDTeV6LSGu",
   "_version" : 1,
   "result" : "created",
   "_shards" : {
      "total" : 2,
      "successful" : 1,
      "failed" : 0
   },
   "_seq_no" : 1,
   "_primary_term" : 1
}

Obtenir l'API

L'API aide à extraire un objet JSON de type en effectuant une demande d'obtention pour un document particulier.

pre class="prettyprint notranslate" > GET schools/_doc/5

En exécutant le code ci-dessus, nous obtenons le résultat suivant -

{
   "_index" : "schools",
   "_type" : "_doc",
   "_id" : "5",
   "_version" : 7,
   "_seq_no" : 3,
   "_primary_term" : 1,
   "found" : true,
   "_source" : {
      "name" : "Central School",
      "description" : "CBSE Affiliation",
      "street" : "Nagan",
      "city" : "paprola",
      "state" : "HP",
      "zip" : "176115",
      "location" : [
         31.8955385,
         76.8380405
      ],
      "fees" : 2200,
      "tags" : [
         "Senior Secondary",
         "beautiful campus"
      ],
      "rating" : "3.3"
   }
}
  • Cette opération est en temps réel et n'est pas affectée par le taux de rafraîchissement de l'Index.

  • Vous pouvez également spécifier la version, puis Elasticsearch récupérera uniquement cette version du document.

  • Vous pouvez également spécifier le _all dans la requête, afin qu'Elasticsearch puisse rechercher cet identifiant de document dans chaque type et il renverra le premier document correspondant.

  • Vous pouvez également spécifier les champs souhaités dans votre résultat à partir de ce document particulier.

GET schools/_doc/5?_source_includes=name,fees

En exécutant le code ci-dessus, nous obtenons le résultat suivant -

{
   "_index" : "schools",
   "_type" : "_doc",
   "_id" : "5",
   "_version" : 7,
   "_seq_no" : 3,
   "_primary_term" : 1,
   "found" : true,
   "_source" : {
      "fees" : 2200,
      "name" : "Central School"
   }
}

Vous pouvez également récupérer la partie source dans votre résultat en ajoutant simplement la partie _source dans votre demande d'obtention.

GET schools/_doc/5?_source

En exécutant le code ci-dessus, nous obtenons le résultat suivant -

{
   "_index" : "schools",
   "_type" : "_doc",
   "_id" : "5",
   "_version" : 7,
   "_seq_no" : 3,
   "_primary_term" : 1,
   "found" : true,
   "_source" : {
      "name" : "Central School",
      "description" : "CBSE Affiliation",
      "street" : "Nagan",
      "city" : "paprola",
      "state" : "HP",
      "zip" : "176115",
      "location" : [
         31.8955385,
         76.8380405
      ],
      "fees" : 2200,
      "tags" : [
         "Senior Secondary",
         "beautiful campus"
      ],
      "rating" : "3.3"
   }
}

Vous pouvez également actualiser la partition avant d'effectuer l'opération get en définissant le paramètre d'actualisation sur true.

Supprimer l'API

Vous pouvez supprimer un index, un mappage ou un document particulier en envoyant une requête HTTP DELETE à Elasticsearch.

DELETE schools/_doc/4

En exécutant le code ci-dessus, nous obtenons le résultat suivant -

{
   "found":true, "_index":"schools", "_type":"school", "_id":"4", "_version":2,
   "_shards":{"total":2, "successful":1, "failed":0}
}

La version du document peut être spécifiée pour supprimer cette version particulière. Le paramètre de routage peut être spécifié pour supprimer le document d'un utilisateur particulier et l'opération échoue si le document n'appartient pas à cet utilisateur particulier. Dans cette opération, vous pouvez spécifier les options d'actualisation et d'expiration de la même manière que l'API GET.

Mettre à jour l'API

Le script est utilisé pour effectuer cette opération et la gestion des versions est utilisée pour s'assurer qu'aucune mise à jour ne s'est produite pendant l'obtention et la réindexation. Par exemple, vous pouvez mettre à jour les frais de scolarité en utilisant le script -

POST schools/_update/4
{
   "script" : {
      "source": "ctx._source.name = params.sname",
      "lang": "painless",
      "params" : {
         "sname" : "City Wise School"
      }
   }
 }

En exécutant le code ci-dessus, nous obtenons le résultat suivant -

{
   "_index" : "schools",
   "_type" : "_doc",
   "_id" : "4",
   "_version" : 3,
   "result" : "updated",
   "_shards" : {
      "total" : 2,
      "successful" : 1,
      "failed" : 0
   },
   "_seq_no" : 4,
   "_primary_term" : 2
}

Vous pouvez vérifier la mise à jour en envoyant une demande d'obtention au document mis à jour.