>  기사  >  백엔드 개발  >  Elasticsearch 인덱스 및 문서 작업 예제 튜토리얼

Elasticsearch 인덱스 및 문서 작업 예제 튜토리얼

零下一度
零下一度원래의
2017-06-23 16:02:583399검색
  • Elasticsearch 버전: 5.4

  • Elasticsearch 빠른 시작 파트 1: Elasticsearch 시작하기

  • Elasticsearch 빠른 시작 파트 2: Elasticsearch 및 Kibana 설치

  • Elasticsearch 빠른 시작 파트 3: Elasticsearch 색인 및 문서 작업

  • Elasticsearch 빠른 시작 4부: Elasticsearch 문서 쿼리

강좌 추천 →: "Elasticsearch 전체 텍스트 검색 실전 전투"(실용 동영상)

강좌에서"10까지의 동시 솔루션 of Millions of Data Solution (이론적 + 실용적)》

List all indexes

GET /_cat/indices?v

반환된 내용은 다음과 같습니다.

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

클러스터에 인덱스가 있는 것을 확인할 수 있습니다

색인 만들기

이제 customer라는 색인을 만든 다음 모든 색인을 다시 나열해 보겠습니다.

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

첫 번째 줄을 실행하면 다음이 반환됩니다. 여기서는 PUT 조건자를 사용하여 customer라는 색인을 만듭니다. 다음에 위의 pretty는 반환된 데이터가 있는 경우 형식이 지정된 JSON을 사용하여 데이터를 반환한다는 의미입니다.

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

두 번째 줄을 실행하면 다음 콘텐츠가 반환됩니다. 결과는 customer 라는 인덱스에 있음을 알려줍니다. 생성되었으며 기본 샤드 5개와 복제본 샤드 1개(기본적으로 1개)가 있지만 이 인덱스에는 아직 문서가 없습니다.

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

아마도 customer 인덱스의 상태 값이 yellow로 표시된 것을 눈치채셨을 것입니다. 앞서 논의한 내용을 떠올려 보면 yellow 는 인덱스의 복제본 샤드(사본)가 할당되지 않았음을 의미합니다. 아직. 인덱스에 이러한 상황이 발생하는 이유는 Elasticsearch가 기본적으로 인덱스 복사본을 생성하기 때문입니다. 현재 노드가 1개뿐이므로 향후 다른 노드가 있을 때까지 이 복사본을 할당할 수 없습니다. 클러스터에 추가되었습니다. 복제본이 다른 노드에 할당되면 인덱스의 상태가 green이 됩니다.

문서 색인화 및 쿼리

다음으로 customer 색인에 무언가를 입력합니다. 앞서 언급했듯이 문서를 색인화하려면 문서가 어떤 색인 유형에 속해야 하는지 Elasticsearch 에 알려야 합니다. 아래에서는 간단한 문서를 customer 색인에 색인화하고 유형 이름은 external 입니다. ID 1

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

에 대해 반환된 내용은 다음과 같습니다.

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

위에서 볼 수 있듯이 새 고객 문서가 customer 인덱스의 extenal 유형에 성공적으로 인덱싱되었으며, 인덱싱할 때 문서를 지정합니다. 내부 ID 값은 1입니다.

Elasticsearch 에서는 문서를 인덱스로 인덱싱하기 전에 명시적으로 인덱스를 생성할 것을 요구하지 않는다는 점에 주목할 가치가 있습니다. 예를 들어 이전 예에서 customer 인덱스가 존재하지 않으면 Elasticsearch가 자동으로 인덱스를 생성합니다.

방금 인덱싱한 문서를 살펴보겠습니다

GET /customer/external/1?pretty

반환된 내용은 다음과 같습니다.

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

여기서 특별한 점은 발견된 필드로, ID가 다음과 같은 문서를 찾았음을 나타냅니다. 1 및 또 다른 특수 field_ source는 이전 단계에서 인덱싱된 문서를 저장합니다.

색인 삭제

이제 방금 생성한 색인을 삭제하고 모든 색인을 다시 살펴보겠습니다.

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

첫 번째 줄은 다음 콘텐츠를 반환합니다.

{  "acknowledged": true}

두 번째 줄은 다음 콘텐츠를 반환합니다.

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

위 콘텐츠에서 customerindex가 삭제된 것을 확인할 수 있습니다.

계속 공부하기 전에 이 섹션에서 학습한 API 명령을 빠르게 검토해 보세요.

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

위 명령을 주의 깊게 연구하면 elasticsearch에서 데이터에 액세스하는 데 사용하는 패턴을 찾아야 하며, 이는 다음과 같이 요약됩니다. :

rreee

使用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 

위 내용은 Elasticsearch 인덱스 및 문서 작업 예제 튜토리얼의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.