我有一个大文件,每行都有一个JSON对象。一行看起来像这样:
{"_id":0, "foreign_key":-1, "text":"foobar"}
我非常清楚,我可以将_id
重命名为primary_key
,但我不会遇到问题,但是我仍然想知道是否可以使用我在ES的_id
字段中为对象计算的ID。
以下示例代码失败,不允许在JSON对象本身中指定元字段_id
。
除了上一段中的重命名解决方案外,我还可以在_id
中手动指定IndexRequestBuilder
。但是我的文件包含了超过一百万行,并且在解析JSON以从中提取ID时,我不愿意放弃性能。
private void indexAll() {
TransportClient client + ... // setup omitted for brevity
BulkRequestBuilder bulkRequest = client.prepareBulk();
try (Stream<String> stream = Files.list(myFile)) {
stream.forEach(l -> addRequest(bulkRequest, client, l));
}
BulkResponse bulkResponse = bulkRequest.get();
if (bulkResponse.hasFailures()) {
// error handling
}
}
private void addRequest(BulkRequest bulk, TransportClient client, String line) {
IndexRequestBuilder req = client.prepareIndex("myIndex", "_doc"):
req.setSource(line, XContentType.JSON);
bulk.add(req);
}
是否有一种方法可以按照给定的JSON对象编制索引并使用其_id
?