本系列博客ES版本如下:
7.17.X4.4.XElasticsearch下载地址
Spring Data Elasticsearch 下载地址
ES创建文档可以通过如下4种API,它们看着类似,功能上少许不同。
PUT //_doc/<_id> POST //_doc/ PUT //_create/<_id> POST //_create/<_id> 命令中表示一个索引(index)或者数据流(data stream)
命令中_doc是固定写法,无需深究
命令中_create表示创建一个新的文档,如果指定的<_id>文档已经存在,则返回失败
注意:数据流的情况比较复杂,学习先以索引为主,熟练后再考虑数据流场景
| 命令 | 含义 | id已经存在 | 数据流 |
|---|---|---|---|
PUT / | 创建或覆盖指定id的文档 | 覆盖,相当于先删后创建 | 不支持 |
POST / | 创建自动生成id的文档 | X | 支持 |
PUT / | 创建指定id的文档 | 返回失败 | 支持 |
POST / | 创建指定id的文档 | 返回失败 | 支持 |
PUT //_doc/<_id> 创建或覆盖指定id的文档
GET pigg_test/_search
PUT pigg_test/_doc/1
{
"name": "亚瑟王",
"age": 33
}
PUT pigg_test/_doc/1
{
"name": "马超",
"sex": 1
}
运行结果如下,可看出文档被覆盖了

POST //_doc/ 用POST插入一个文档,不指定ID,会给文档自动生成ID
POST pigg_test/_doc
{
"name": "吕布"
}
运行结果如下,可看出新创建的文档的ID是自生成的一串乱码

PUT //_create/<_id> & POST //_create/<_id> 这2个命令指定/_create/<_id>,说明当id已经存在时,会返回错误。

在用ES原生Java API创建文档时,可以设置opType(DocWriteRequest.OpType.CREATE)来指定是Create文档的操作。
这个opType默认值是OpType.INDEX。
IndexRequest request = new IndexRequest("pigg_test")
.id("1")
.source("name", "亚瑟")
.opType(DocWriteRequest.OpType.CREATE);//指定是create
try {
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
} catch(ElasticsearchException e) {
if (e.status() == RestStatus.CONFLICT) {
}
}
当使用Spring Data Elasticsearch时,可以使用CrudRepository接口里的方法也可以使用DocumentOperations接口里的方法。
CrudRepository接口@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
<S extends T> S save(S entity);
<S extends T> Iterable<S> saveAll(Iterable<S> entities);
}
DocumentOperations接口public interface DocumentOperations {
<T> T save(T entity);
<T> T save(T entity, IndexCoordinates index);
<T> Iterable<T> save(Iterable<T> entities);
<T> Iterable<T> save(Iterable<T> entities, IndexCoordinates index);
<T> Iterable<T> save(T... entities);
}