Maison  >  Article  >  développement back-end  >  Tutoriel d'exemple d'opération d'indexation et de document Elasticsearch

Tutoriel d'exemple d'opération d'indexation et de document Elasticsearch

零下一度
零下一度original
2017-06-23 16:02:583380parcourir
  • Version d'Elasticsearch : 5.4

  • Démarrage rapide d'Elasticsearch Partie 1 : Démarrer avec Elasticsearch

  • Démarrage rapide d'Elasticsearch Partie 1 2 articles : Installation d'Elasticsearch et Kibana

  • Article de démarrage rapide d'Elasticsearch 3 : Opérations sur les index et les documents Elasticsearch

  • Article de démarrage rapide d'Elasticsearch 4 : Requête de documents Elasticsearch

Recommandation de cours → : "Elasticsearch Full Text Search Practice" (Vidéo pratique)

Extrait du cours "Solution concurrente pour des dizaines de millions de données (théorique + pratique)"

Liste de tous les index

GET /_cat/indices?v

Le contenu renvoyé est le suivant :

health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   .kibana XYZPR5XGQGWj8YlyZ1et_w   1   1          1            0      3.1kb          3.1kb

Vous pouvez voir qu'il y a un index dans le cluster

Créer un index

Créons maintenant un index appelé client et listons à nouveau tous les index

PUT /customer?pretty
GET /_cat/indices?v

Exécuter les retours de la première ligne ce qui suit, nous utilisons ici le prédicat PUT pour créer un index nommé customer, suivi de pretty pour indiquer que s'il y a des données à renvoyer, utilisez JSON formaté pour renvoyer les données

{  "acknowledged": true,  "shards_acknowledged": true}

L'exécution de la deuxième ligne renvoie le contenu suivant. Le résultat nous indique qu'un index nommé client a été créé. fragment (1 par défaut), il n'y a pas encore de documents dans cet index.

health status index    uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   .kibana  XYZPR5XGQGWj8YlyZ1et_w   1   1          1            0      3.1kb          3.1kb
yellow open   customer M8i1ZxhsQJqk7HomOA7c_Q   5   1          0            0       650b           650b

Peut-être avez-vous remarqué que la valeur de santé de l'index client est marquée comme jaune, rappelant ce dont nous avons discuté plus tôt, jaune indique que les fragments répliqués (copies) de l'index n'ont pas encore été alloués. La raison de cette situation avec cet index est que Elasticsearch créera une copie de cet index par défaut Puisque nous n'avons qu'un seul nœud à ce moment, cette copie ne peut pas être allouée (pour une haute disponibilité jusqu'à un autre). Le nœud est ajouté au cluster ultérieurement. Une fois la réplique allouée à un autre nœud, l'état de santé de l'index deviendra vert .

Indexation et interrogation de documents

Ensuite, nous mettons quelque chose dans l'index client . Comme mentionné précédemment, afin d'indexer un document, nous devons indiquer à Elasticsearch à quel type d'index le document doit appartenir. Ci-dessous, nous indexons un document simple à l'index client , type. Le nom est externe et l'ID est 1

PUT /customer/external/1?pretty
{  "name": "John Doe"}

Le contenu renvoyé est le suivant :

{  "_index": "customer",  "_type": "external",  "_id": "1",  "_version": 1,  "result": "created",  "_shards": {"total": 2,"successful": 1,"failed": 0
  },  "created": true}

D'après ce qui précède, on peut voir qu'un nouveau document client est indexé avec succès dans le type extenal de l'index client, et nous spécifions la valeur d'identification interne du document comme 1 lors de l’indexation.

Il convient de noter que Elasticsearch ne vous oblige pas à créer explicitement un index avant d'indexer des documents dans un index. Par exemple, dans l'exemple précédent, si l'index client n'existe pas, Elasticsearch créera automatiquement l'index.

Jetons un œil au document que nous venons d'indexer

GET /customer/external/1?pretty

Le contenu renvoyé est le suivant :

{  "_index": "customer",  "_type": "external",  "_id": "1",  "_version": 1,  "found": true,  "_source": {"name": "John Doe"
  }
}

Comparez ici Le champ spécial est le champ trouvé, qui indique que nous avons trouvé un document avec un identifiant de 1. Un autre champ spécial, _source, enregistre le document indexé à l'étape précédente.

Supprimer l'index

Supprimons maintenant l'index que nous venons de créer et visualisons à nouveau tous les index.

DELETE /customer?pretty
GET /_cat/indices?v

La première ligne renvoie le contenu suivant :

{  "acknowledged": true}

La deuxième ligne renvoie le contenu suivant :

health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   .kibana XYZPR5XGQGWj8YlyZ1et_w   1   1          1            0      3.1kb          3.1kb

Comme vous pouvez le voir dans le contenu ci-dessus, notre index client a été supprimé.

Avant de continuer à étudier, passons en revue rapidement les commandes API apprises dans cette section

PUT /customer
PUT /customer/external/1{  "name": "John Doe"}
GET /customer/external/1DELETE /customer

Si vous étudiez attentivement les commandes ci-dessus, vous devriez constater que elasticsearch Le mode utilisé pour accéder aux données se résume ainsi :

<REST Verb> /<Index>/<Type>/<ID>

使用REST 访问模式,在所有的API命令中是十分普遍的,如果你可以简单记住它,对于掌握 Elasticsearch ,那么已经开了一个好头。

修改数据

 Elasticsearch  具有近实时的操作和查询数据的能力,默认情况下,从你索引,更新或者删除你的数据到用户可以搜索到新的结果这个过程大概需要1秒(基于refresh 频率)。它们和类似SQL这样的平台不一样,SQL的数据在事务完成后就马上就生效,不会有延迟。

索引/替换文档

之前已经演示了怎么索引单个文档,再来回顾一下:

PUT /customer/external/1?pretty
{  "name": "John Doe"}

上面的命令将会索引指定文档到 customer 索引的 external 类型,文档的id值是1。如果我们用不同的文档内容(或者相同)再次执行上面的命令,elasticsearch将会用一个新的文档取代旧的文档(即重建索引)。

PUT /customer/external/1?pretty
{  "name": "Jane Doe"}

上面的操作把id为1的文档的name字段由"john doe"改成"jane doe"。另一方面,如果我们使用不同的id执行上述命令,将会创建一个新的文档,旧的文档会保持原样。

PUT /customer/external/2?pretty
{  "name": "Jane Doe"}

以上操作索引了一个新的id为2文档。

索引新文档的时候,id值是可选的。如果没有指定, elasticsearch 将会为文档生成一个随机的id。实际生成的id将会保存在调用api接口的返回结果中。

下面的例子展示不指定文档id的时候是如何索引文档的:

POST /customer/external?pretty
{  "name": "Jane Doe"}

返回内容如下:

{  "_index": "customer",  "_type": "external",  "_id": "AVyc9L6dtgHksqXKpTlM",  "_version": 1,  "result": "created",  "_shards": {"total": 2,"successful": 1,"failed": 0
  },  "created": true}

注意,在上面的例子中,因为没有指定id,我们需要使用POST谓词取代之前的PUT谓词。

更新文档

除了可以索引和替换文档之外,我们还可以更新文档。注意, elasticsearch 并没有在原来的文档基础上进行更新,每当进行更新时, Elasticsearch 将删除旧的文档,然后索引新的文档。以下例子演示了如何更新文档,把之前ID为1的name字段改为"Jane Doe":

POST /customer/external/1/_update?pretty
{  "doc": { "name": "Jane Doe" }
}

以下例子演示了如何更新先前ID为1的文档,改变name字段为"Jane Doe" 的同时添加age字段

POST /customer/external/1/_update?pretty
{  "doc": { "name": "Jane Doe", "age": 20 }
}

也可以使用简单的脚本来执行更新。以下示例使用脚本将年龄增加5:

POST /customer/external/1/_update?pretty
{  "script" : "ctx._source.age += 5"}

在以上例子中, ctx._source 指当前即将被更新的源文档。请注意,在撰写本文时,只能一次更新单个文档。将来, Elasticsearch 可能会提供通过查询条件(如SQL UPDATE-WHERE语句)更新多个文档的功能。

删除文档

删除文档非常简单,以下例子演示了怎么删除 customer 索引下ID为2的文档,查阅Delete By Query API 删除与特定查询匹配的所有文档。值得注意的是,直接删除整个索引比通过query api 删除所有文档更高效。

DELETE /customer/external/2?pretty

批处理

除了能够索引,更新和删除单个文档之外, Elasticsearch  也提供了使用  _bulk API 批量执行上述任何操作的功能。这个功能是非常重要的,因为它提供了一个非常有效的机制来尽可能快地进行多个操作,并且尽可能减少网络的往返行程。简单举个例子,下面会在一个 bulk操作中索引两个文档:

POST /customer/external/_bulk?pretty
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }

返回内容如下:

{  "took": 27,  "errors": false,  "items": [
    {      "index": {"_index": "customer","_type": "external","_id": "1","_version": 1,"result": "created","_shards": {          "total": 2,          "successful": 1,          "failed": 0},"created": true,"status": 201  }
    },
    {      "index": {"_index": "customer","_type": "external","_id": "2","_version": 1,"result": "created","_shards": {          "total": 2,          "successful": 1,          "failed": 0},"created": true,"status": 201  }
    }
  ]
}

下面的例子会在一个操作内更新第一个文档同时删除第二个文档:

POST /customer/external/_bulk?pretty
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}

返回内容如下:

{  "took": 25,  "errors": false,  "items": [
    {      "update": {"_index": "customer","_type": "external","_id": "1","_version": 2,"result": "updated","_shards": {          "total": 2,          "successful": 1,          "failed": 0},"status": 200  }
    },
    {      "delete": {"found": true,"_index": "customer","_type": "external","_id": "2","_version": 2,"result": "deleted","_shards": {          "total": 2,          "successful": 1,          "failed": 0},"status": 200  }
    }
  ]
}

注意以上的删除操作,在它之后并没有相应的源文档,因为只需要文档的ID就能删除。

如果某个操作因某些原因执行失败,不会影响后面的操作,它会继续执行剩下的操作。api返回结果时,每一个操作都会提供状态(和接收到的顺序一致),你可以通过这个状态检查操作是否执行成功。

总结

简单的索引操作

1、查看集群中的索引, GET /_cat/indices?v 

2、创建索引 PUT /product?pretty 。(es会自动建立index和type,不需要提前创建,而且es默认会对document每个field都建立倒排索引,让其可以被搜索)

3、删除索引, DELETE /test_index?pretty 

文档的CRUD操作

1、新增商品

PUT /product/goods/1{"goods_id": "10","goods_name": "索爱C702c","createTime": "2016-12-21","goods_type": ["华为","乐视","小米"]
}

2、查询商品, GET /product/goods/1 

3、修改商品

方式1:替换文档(和创建一样,所有字段必须写全)

PUT /product/goods/4{"goods_id": "40","goods_name": "联想笔记本","createTime": "2017-05-21","goods_type": ["电脑"]
}

字段不写全的情况

 方式2:更新文档

POST /product/goods/1/_update
{  "doc":{"goods_name":"iphone手机"
  }
}

比较创建,更新,替换文档返回结果:

4、删除商品, DELETE /product/goods/4 

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn