Index API
索引请求
IndexRequest
需要以下参数:
IndexRequest request = new IndexRequest(
"posts",
"doc",
"1");
String jsonString = "{" +
"\"user\":\"kimchy\"," +
"\"postDate\":\"2013-01-30\"," +
"\"message\":\"trying out Elasticsearch\"" +
"}";
request.source(jsonString, XContentType.JSON);
-
posts
— 索引。 -
doc
— 类型。 -
1
— 文档ID。 - 文档源以字符串形式提供。
提供文档源
除了上面显示的String
示例之外,还可以以不同的方式提供文档源:
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("user", "kimchy");
jsonMap.put("postDate", new Date());
jsonMap.put("message", "trying out Elasticsearch");
IndexRequest indexRequest = new IndexRequest("posts", "doc", "1")
.source(jsonMap);
- 文档源作为
Map
提供,可自动转换为JSON格式。
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
{
builder.field("user", "kimchy");
builder.timeField("postDate", new Date());
builder.field("message", "trying out Elasticsearch");
}
builder.endObject();
IndexRequest indexRequest = new IndexRequest("posts", "doc", "1")
.source(builder);
- 文档源作为
XContentBuilder
对象提供,Elasticsearch内置辅助生成JSON内容。
IndexRequest indexRequest = new IndexRequest("posts", "doc", "1")
.source("user", "kimchy",
"postDate", new Date(),
"message", "trying out Elasticsearch");
- 文档源作为
Object
键值对提供,转换为JSON格式。
可选参数
可以选择提供以下参数:
request.routing("routing");
- 路由值。
request.parent("parent");
- parent值。
request.timeout(TimeValue.timeValueSeconds(1));
request.timeout("1s");
- 等待主碎片可用的作为
TimeValue
的超时。 - 等待主碎片可用的作为
String
的超时。
request.setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL);
request.setRefreshPolicy("wait_for");
- 刷新策略作为
WriteRequest.RefreshPolicy
实例提供。 - 刷新策略作为
String
提供。
request.version(2);
- 版本。
request.versionType(VersionType.EXTERNAL);
- 版本类型。
request.opType(DocWriteRequest.OpType.CREATE);
request.opType("create");
- 操作类型作为
DocWriteRequest.OpType
值提供。 - 作为
String
提供的操作类型:可以为create
或update
(默认)。
request.setPipeline("pipeline");
- 索引文档之前要执行的摄取管道的名称。
同步执行
以下列方式执行IndexRequest
时,客户端在继续执行代码之前等待返回IndexResponse
:
IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
异步执行
执行IndexRequest
也可以以异步方式完成,以便客户端可以直接返回,用户需要通过将请求和侦听器传递给异步索引方法来指定响应或潜在故障的处理方式:
client.indexAsync(request, RequestOptions.DEFAULT, listener);
- 要执行的
IndexRequest
和执行完成时要使用的ActionListener
。
异步方法不会阻塞并立即返回,一旦完成,如果执行成功完成,则使用onResponse
方法回调ActionListener
,如果失败则使用onFailure
方法。
index
的典型侦听器如下所示:
listener = new ActionListener<IndexResponse>() {
@Override
public void onResponse(IndexResponse indexResponse) {
}
@Override
public void onFailure(Exception e) {
}
};
-
onResponse
— 执行成功完成时调用。 -
onFailure
— 当整个IndexRequest
失败时调用。
索引响应
返回的IndexResponse
允许检索有关已执行操作的信息,如下所示:
String index = indexResponse.getIndex();
String type = indexResponse.getType();
String id = indexResponse.getId();
long version = indexResponse.getVersion();
if (indexResponse.getResult() == DocWriteResponse.Result.CREATED) {
} else if (indexResponse.getResult() == DocWriteResponse.Result.UPDATED) {
}
ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo();
if (shardInfo.getTotal() != shardInfo.getSuccessful()) {
}
if (shardInfo.getFailed() > 0) {
for (ReplicationResponse.ShardInfo.Failure failure :
shardInfo.getFailures()) {
String reason = failure.reason();
}
}
- 处理(如果需要)第一次创建文档的情况。
- 处理(如果需要)文档被重写的情况,因为它已经存在。
- 处理成功碎片数小于总碎片数的情况。
- 处理潜在的失败。
如果存在版本冲突,则抛出ElasticsearchException
:
IndexRequest request = new IndexRequest("posts", "doc", "1")
.source("field", "value")
.version(1);
try {
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
} catch(ElasticsearchException e) {
if (e.status() == RestStatus.CONFLICT) {
}
}
- 引发的异常表示返回了版本冲突错误。
如果将opType
设置为create
并且已存在具有相同索引、类型和ID的文档,则会发生相同的情况:
IndexRequest request = new IndexRequest("posts", "doc", "1")
.source("field", "value")
.opType(DocWriteRequest.OpType.CREATE);
try {
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
} catch(ElasticsearchException e) {
if (e.status() == RestStatus.CONFLICT) {
}
}
- 引发的异常表示返回了版本冲突错误。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。