如何使用java API在现有的elasticsearch索引中添加更多文档?

时间:2015-07-02 09:37:40

标签: java indexing elasticsearch java-api

我创建了一个索引并使用java Index API添加了一个文档。

client.prepareIndex("details", "Key", i).setSource(putJsonDocumentString(Key, Value)).execute().actionGet();

这很好用。已创建索引并正确索引文档。现在,我需要添加另一个文档" Keys2"在同一个索引中。所以,我这样做了,

client.prepareUpdate("details", "Keys2", i).setScriptParams(putJsonDocumentString(Key, Value)).execute().actionGet();

但是,它没有被添加到上述索引中。我不想使用批量API(我不断收到ClusterBlockedException,它从未解决,加上我也没有太多数据)我无法找到任何样本程序做同样的事情。

例外是:

  

ActionRequestValidationException :验证失败:1:缺少脚本或文档

如何解决此问题?

方法putJsonDocumentString()返回一个Map<string, Object>,它应该与setScriptParams()一起使用,对吗?

2 个答案:

答案 0 :(得分:1)

如果我理解得很好,你想在同一个索引中添加另一个文档。

在这种情况下,这很简单:您可以使用与第一个文档相同的API,但使用相关参数:

client.prepareIndex("details", <type_name>, <id>).setSource(putJsonDocumentString(Key, Value)).execute().actionGet();

使用和占位第二个文档的实际价值。根据您的描述,Key2是id,而不是文档的类型。

如果您对索引类型文档概念感到困惑,请查看basic description from the documentation

prepareIndex API将文档添加(或更新)到索引。在您的情况下,如果您之前没有创建索引和类型,ElasticSearch将使用默认参数即时创建它。

prepareUpdate API用于更新现有文档,而不是将新文档添加到现有索引。来自documentation

The update API allows to update a document based on a script provided.

解释了您的错误消息。

答案 1 :(得分:0)

正如@ThomasC所说,您应该以与第一个文档相同的方式索引后续文档。 我认为您遇到的问题是您尝试使用相同的ID和不同类型索引2个文档。你可以通过索引第一个来解决这个问题:

client.prepareIndex("details", "Key", "ID1").setSource(putJsonDocumentString(Key, Value)).execute().actionGet();

第二个是这样的:

client.prepareIndex("details", "Key2", "ID2").setSource(putJsonDocumentString(Key, Value)).execute().actionGet();

理想情况下,ID将更容易确保是唯一的,例如UUID。