版本约定
本系列博客ES版本如下:
- Elasticsearch
7.17.X
- Spring Data Elasticsearch
4.4.X
Elasticsearch下载地址
Spring Data Elasticsearch 下载地址
创建文档API
ES创建文档可以通过如下4种API,它们看着类似,功能上少许不同。
PUT /<target>/_doc/<_id>
POST /<target>/_doc/
PUT /<target>/_create/<_id>
POST /<target>/_create/<_id>
命令中<target>
表示一个索引(index)或者数据流(data stream)
命令中_doc
是固定写法,无需深究
命令中_create
表示创建一个新的文档,如果指定的<_id>
文档已经存在,则返回失败
注意:数据流的情况比较复杂,学习先以索引为主,熟练后再考虑数据流场景
命令 | 含义 | id已经存在 | 数据流 |
---|---|---|---|
PUT /<target>/_doc/<_id> |
创建或覆盖指定id的文档 | 覆盖,相当于先删后创建 | 不支持 |
POST /<target>/_doc/ |
创建自动生成id的文档 | X | 支持 |
PUT /<target>/_create/<_id> |
创建指定id的文档 | 返回失败 | 支持 |
POST /<target>/_create/<_id> |
创建指定id的文档 | 返回失败 | 支持 |
1 PUT /<target>/_doc/<_id>
创建或覆盖指定id的文档
GET pigg_test/_search
PUT pigg_test/_doc/1
{
"name": "亚瑟王",
"age": 33
}
PUT pigg_test/_doc/1
{
"name": "马超",
"sex": 1
}
运行结果如下,可看出文档被覆盖了
2 POST /<target>/_doc/
用POST插入一个文档,不指定ID,会给文档自动生成ID
POST pigg_test/_doc
{
"name": "吕布"
}
运行结果如下,可看出新创建的文档的ID是自生成的一串乱码
3 PUT /<target>/_create/<_id>
& POST /<target>/_create/<_id>
这2个命令指定/_create/<_id>
,说明当id已经存在时,会返回错误。
Java API
1 Elasticsearch Java API
在用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) {
}
}
2 Spring Data Elasticsearch
当使用Spring Data Elasticsearch时,可以使用CrudRepository
接口里的方法也可以使用DocumentOperations
接口里的方法。
1 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);
}
2 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);
}
本文含有隐藏内容,请 开通VIP 后查看