Elasticsearch更新indexdocument

时间:2016-01-31 13:41:31

标签: java elasticsearch elasticsearch-java-api

我需要更新elasticsearch表的索引文档,这是我实现的代码。但它不起作用,出了什么问题,我应该如何实现呢?

我的代码。

Map<String, Object> matching_result;
for (SearchHit hit : response_text.getHits()) {
    matching_result = hit.getSource();
    String flag_value = matching_result.get("flag").toString();
    matching_result.put("flag", true);
}

String indexString = JSONConverter.toJsonString(matching_result);

IndexResponse response = client.prepareIndex("index_name", "data").setSource(indexString).execute().actionGet();
boolean created = response.isCreated();
System.out.println("created or updated--------------------->" + created);
System.out.println("flag value==========" + matching_result.get("flag"));
return actual_theme;

(JSONConverter.toJsonString)是我们用于转换为json字符串的库类。 这个查询有什么问题? 它不是更新现有文档,而是创建一个新文档。我想改变现有的。

1 个答案:

答案 0 :(得分:2)

根据您的示例代码,看起来“更新”意味着您正在尝试替换整个文档。为此,您必须指定要更新的文档的id

使用Java API,除了在setSource上调用IndexRequestBuilder之外,您还需要通过调用setId来提供ID。例如:

IndexResponse response = client.prepareIndex("index_name", "data")
  .setSource(indexString)
  .setId(123)    <----- supply the ID of the document you want to replace
  .execute()
  .actionGet();

否则,您知道,在ES中您可以选择进行部分更新。也就是说,只更新文档中的某些字段。这可以通过脚本或提供部分文档来完成。看看documentation for the Update API

在任何一种情况下,您都需要向ES提供您要修改的文档的ID。