确保创建一个新文档的最简单办法是,使用索引请求的 POST
形式让 Elasticsearch 自动生成唯一 _id
:
POST /website/blog/
{ ... }
如果已经有自己的 _id
,那么我们必须告诉 Elasticsearch ,只有在相同的 _index
、 _type
和 _id
不存在时才接受我们的索引请求。这里有两种方式,
第一种方法使用 op_type
查询-字符串参数:
PUT /website/blog/123?op_type=create
{ ... }
第二种方法是在 URL 末端使用 /_create
:
PUT /website/blog/123/_create
{ ... }
如果创建新文档的请求成功执行,Elasticsearch 会返回元数据。
{
"_index": "website",
"_type": "blog",
"_id": "124",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 1
}
另一方面,如果具有相同的 _index
、 _type
和 _id
的文档已经存在,Elasticsearch 将会返回 409 Conflict
响应码,以及如下的错误信息:
{
"error": {
"root_cause": [
{
"type": "version_conflict_engine_exception",
"reason": "[123]: version conflict, document already exists (current version [2])",
"index_uuid": "Wj1GkA3RQOGFj7stH75ztg",
"shard": "0",
"index": "website"
}
],
"type": "version_conflict_engine_exception",
"reason": "[123]: version conflict, document already exists (current version [2])",
"index_uuid": "Wj1GkA3RQOGFj7stH75ztg",
"shard": "0",
"index": "website"
},
"status": 409
}