我需要更新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字符串的库类。 这个查询有什么问题? 它不是更新现有文档,而是创建一个新文档。我想改变现有的。
答案 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。