Beispiel-Tutorial für Elasticsearch-Index und Dokumentbetrieb

零下一度
Freigeben: 2022-05-13 11:06:11
Original
3349 Leute haben es durchsucht
  • Elasticsearch-Version: 5.4

  • Elasticsearch-Schnellstart Teil 1: Erste Schritte mit Elasticsearch

  • Elasticsearch-Schnellstart Teil 1 2 Artikel: Elasticsearch- und Kibana-Installation

  • Elasticsearch-Schnellstartartikel 3: Elasticsearch-Index- und Dokumentoperationen

  • Elasticsearch-Schnellstartartikel 4: Elasticsearch-Dokumentabfrage

Kursempfehlung →: "Elasticsearch Volltextsuche praktisch"(Praxisvideo)

Aus dem Kurs „Concurrency Solution for Tens of Millions of Data (Theoretical + Practical)“

Alle Indizes auflisten

GET /_cat/indices?v
Nach dem Login kopieren

Der zurückgegebene Inhalt lautet wie folgt:

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
Nach dem Login kopieren
Nach dem Login kopieren

Sie können sehen, dass im Cluster ein Index vorhanden ist

Index erstellen

Jetzt erstellen wir einen Index namens Kunde und listen alle Indizes erneut auf

PUT /customer?pretty
GET /_cat/indices?v
Nach dem Login kopieren

Das Ausführen der ersten Zeile gibt zurück Im Folgenden verwenden wir das PUT-Prädikat, um einen Index mit dem Namen customer zu erstellen, gefolgt von pretty, um anzugeben, dass, wenn Daten zurückgegeben werden müssen, formatiertes JSON verwendet wird, um die Daten zurückzugeben

{  "acknowledged": true,  "shards_acknowledged": true}
Nach dem Login kopieren

Das Ausführen der zweiten Zeile gibt den folgenden Inhalt zurück. Das Ergebnis sagt uns, dass ein Index mit dem Namen Kunde erstellt wurde. Er hat 5 primäre Shards und 1 Kopie Shard (standardmäßig 1) enthält dieser Index noch keine Dokumente.

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
Nach dem Login kopieren

Vielleicht ist Ihnen aufgefallen, dass der Gesundheitswert des Kundenindex als gelb markiert ist. Sie erinnern sich an das, was wir zuvor besprochen haben. Gelb zeigt an, dass die replizierten Shards (Kopien) des Index noch nicht zugewiesen wurden. Der Grund für diese Situation bei diesem Index ist, dass Elasticsearch standardmäßig eine Kopie dieses Index erstellt. Da wir derzeit nur einen Knoten haben, kann diese Kopie nicht zugewiesen werden (für hohe Verfügbarkeit). Der Knoten wird später zum Cluster hinzugefügt. Sobald das Replikat einem anderen Knoten zugewiesen wird, wird der Gesundheitsstatus des Index grün.

Indizieren und Abfragen von Dokumenten

Als nächstes fügen wir etwas in den Kundenindex ein. Wie bereits erwähnt, müssen wir Elasticsearch mitteilen, zu welchem ​​Indextyp das Dokument gehören soll. Nachfolgend indizieren wir ein einfaches Dokument für den Kundenindex Der Name ist extern und die ID ist 1

PUT /customer/external/1?pretty
{  "name": "John Doe"}
Nach dem Login kopieren
Nach dem Login kopieren

Der zurückgegebene Inhalt lautet wie folgt:

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

Aus dem Obigen ist ersichtlich, dass ein neues Kundendokument erfolgreich in den Typ extenal des Indexes customer indiziert wurde und wir den internen ID-Wert des Dokuments als angeben 1 beim Indizieren.

Es ist erwähnenswert, dass Elasticsearch nicht erfordert, dass Sie explizit einen Index erstellen, bevor Sie Dokumente in einen Index indizieren. Wenn beispielsweise im vorherigen Beispiel der Index customer nicht vorhanden ist, erstellt Elasticsearch automatisch den Index.

Werfen wir einen Blick auf das Dokument, das wir gerade indiziert haben

GET /customer/external/1?pretty
Nach dem Login kopieren

Der zurückgegebene Inhalt lautet wie folgt:

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

Hier vergleichen Das Sonderfeld ist das Gefunden-Feld, das angibt, dass wir ein Dokument mit der ID 1 gefunden haben. Ein weiteres Sonderfeld, _source, speichert das im vorherigen Schritt indizierte Dokument.

Index löschen

Jetzt löschen wir den Index, den wir gerade erstellt haben, und sehen uns alle Indizes erneut an.

DELETE /customer?pretty
GET /_cat/indices?v
Nach dem Login kopieren

Die erste Zeile gibt den folgenden Inhalt zurück:

{  "acknowledged": true}
Nach dem Login kopieren

Die zweite Zeile gibt den folgenden Inhalt zurück:

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
Nach dem Login kopieren
Nach dem Login kopieren

Wie Sie dem obigen Inhalt entnehmen können, wurde unser Kunden-Index gelöscht.

Bevor wir mit dem Studium fortfahren, lassen Sie uns kurz die in diesem Abschnitt erlernten API-Befehle durchgehen

PUT /customer
PUT /customer/external/1{  "name": "John Doe"}
GET /customer/external/1DELETE /customer
Nach dem Login kopieren

Wenn Sie die oben genannten Befehle sorgfältig studieren, sollten Sie feststellen, dass elasticsearch Der für den Zugriff auf Daten verwendete Modus ist wie folgt zusammengefasst:

<REST Verb> /<Index>/<Type>/<ID>
Nach dem Login kopieren

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

修改数据

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

索引/替换文档

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

PUT /customer/external/1?pretty
{  "name": "John Doe"}
Nach dem Login kopieren
Nach dem Login kopieren

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

PUT /customer/external/1?pretty
{  "name": "Jane Doe"}
Nach dem Login kopieren

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

PUT /customer/external/2?pretty
{  "name": "Jane Doe"}
Nach dem Login kopieren

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

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

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

POST /customer/external?pretty
{  "name": "Jane Doe"}
Nach dem Login kopieren

返回内容如下:

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

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

更新文档

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

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

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

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

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

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

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

删除文档

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

DELETE /customer/external/2?pretty
Nach dem Login kopieren

批处理

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

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

返回内容如下:

{  "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  }
    }
  ]
}
Nach dem Login kopieren

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

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

返回内容如下:

{  "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  }
    }
  ]
}
Nach dem Login kopieren

注意以上的删除操作,在它之后并没有相应的源文档,因为只需要文档的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": ["华为","乐视","小米"]
}
Nach dem Login kopieren

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

3、修改商品

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

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

字段不写全的情况

 方式2:更新文档

POST /product/goods/1/_update
{  "doc":{"goods_name":"iphone手机"
  }
}
Nach dem Login kopieren

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

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

Das obige ist der detaillierte Inhalt vonBeispiel-Tutorial für Elasticsearch-Index und Dokumentbetrieb. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!