文章目录
-
-
- [1. `index` 操作](#1.
index
操作) -
- [示例:`index` 操作](#示例:
index
操作) - [Bulk 示例中的 `index` 操作:](#Bulk 示例中的
index
操作:)
- [示例:`index` 操作](#示例:
- [2. `create` 操作](#2.
create
操作) -
- [示例:`create` 操作](#示例:
create
操作) - [Bulk 示例中的 `create` 操作:](#Bulk 示例中的
create
操作:)
- [示例:`create` 操作](#示例:
- [3. `update` 操作](#3.
update
操作) -
- [示例:`update` 操作](#示例:
update
操作) - [Bulk 示例中的 `update` 操作:](#Bulk 示例中的
update
操作:)
- [示例:`update` 操作](#示例:
- [4. 区别总结](#4. 区别总结)
- 总结
- [1. `index` 操作](#1.
-
在 Elasticsearch 中, index
、 update
和 create
是常用的操作类型,它们用于不同的场景,且具有不同的行为。下面详细解释这三个操作的区别,并提供相关的示例。
1. index
操作
- 功能 :
index
操作用于插入文档,如果文档的_id
已经存在,则会覆盖该文档(即进行替换)。 - 使用场景:适用于需要插入新文档,或者更新已有文档的场景。
- 注意 :
index
操作是幂等的(idempotent)。即使你多次执行相同的操作,只要文档内容没有变化,最终结果不会受到影响。
示例:index
操作
json
POST /articles/_doc/1
{
"title": "Tech News Today",
"tags": ["tech", "news", "AI"]
}
-
如果
_id
为1
的文档不存在,则会插入一个新的文档。POST /articles/_search
[
{
"_index" : "articles",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"title" : "Tech News Today",
"tags" : [
"tech",
"news",
"AI"
]
}
}
] -
如果
_id
为1
的文档已存在,则会被替换为新的文档。POST /articles/_doc/1
{
"title": "Tech News Today"
}POST /articles/_search
[
{
"_index" : "articles",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"title" : "Tech News Today"
}
}
]
Bulk 示例中的 index
操作:
json
{ "index": { "_id": 1 } }
{ "title": "Tech News Today", "tags": ["tech", "news", "AI"] }
2. create
操作
- 功能 :
create
操作用于插入新文档。如果文档的_id
已经存在,操作会失败(返回错误)。这意味着该操作只能用于创建新文档,而不能更新或替换已有文档。 - 使用场景:适用于你想要确保文档不存在时插入文档的情况。比如避免覆盖现有的文档。
示例:create
操作
json
POST /articles/_doc/1/_create
{
"title": "Tech News Today",
"tags": ["tech", "news", "AI"]
}
-
如果
_id
为1
的文档已存在,Elasticsearch 会返回错误,提示该文档已经存在。{
"error" : {
"root_cause" : [
{
"type" : "version_conflict_engine_exception",
"reason" : "[1]: version conflict, document already exists (current version [2])",
"index_uuid" : "mu6PYHhxTRSOOOjSZoPmaQ",
"shard" : "0",
"index" : "articles"
}
],
"type" : "version_conflict_engine_exception",
"reason" : "[1]: version conflict, document already exists (current version [2])",
"index_uuid" : "mu6PYHhxTRSOOOjSZoPmaQ",
"shard" : "0",
"index" : "articles"
},
"status" : 409
} -
如果
_id
为1
的文档不存在,它将会被插入。
Bulk 示例中的 create
操作:
json
{ "create": { "_id": 1 } }
{ "title": "Tech News Today", "tags": ["tech", "news", "AI"] }
3. update
操作
- 功能 :
update
操作用于更新已有的文档。如果文档存在,它会更新文档的部分内容;如果文档不存在,则会抛出错误。 - 使用场景 :适用于部分更新文档的场景,特别是当你只需要更新文档的一部分字段时。
update
操作不会覆盖整个文档,只会对指定字段进行修改。
示例:update
操作
json
POST /articles/_doc/1/_update
{
"doc": {
"tags": ["tech", "news", "AI", "machine learning"]
}
}
-
如果
_id
为1
的文档存在,tags
字段将会被更新为新的值。POST /articles/_search
[
{
"_index" : "articles",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"title" : "Tech News Today",
"tags" : [
"tech",
"news",
"AI",
"machine learning"
]
}
}
] -
如果
_id
为1
的文档不存在,Elasticsearch 会返回错误。DELETE articles
POST /articles/_doc/1/_update
{
"doc": {
"tags": ["tech", "news", "AI", "machine learning"]
}
}{
"error" : {
"root_cause" : [
{
"type" : "document_missing_exception",
"reason" : "[_doc][1]: document missing",
"index_uuid" : "B9MrCqCwT5u-GCvgdWB-Rw",
"shard" : "0",
"index" : "articles"
}
],
"type" : "document_missing_exception",
"reason" : "[_doc][1]: document missing",
"index_uuid" : "B9MrCqCwT5u-GCvgdWB-Rw",
"shard" : "0",
"index" : "articles"
},
"status" : 404
}
Bulk 示例中的 update
操作:
json
{ "update": { "_id": 1 } }
{ "doc": { "tags": ["tech", "news", "AI", "machine learning"] } }
4. 区别总结
操作类型 | 目标 | 说明 | 示例 |
---|---|---|---|
index |
插入或替换 | 文档插入,如果文档已经存在则会被替换。 | POST /articles/_doc/1 |
create |
插入 | 仅在文档不存在时插入文档,如果文档已存在,则返回错误。 | POST /articles/_doc/1/_create |
update |
更新 | 仅更新文档的一部分内容,文档必须存在。如果文档不存在,则返回错误。 | POST /articles/_doc/1/_update |
总结
index
用于插入新文档或替换现有文档。create
用于仅在文档不存在时插入新文档,若文档已存在则返回错误。update
用于更新现有文档的部分内容,若文档不存在则返回错误。