0

我需要更新一个弹性搜索表的索引文档,这是我已经实现的代码。但它不起作用,出了什么问题,我应该如何实施?

我的代码。

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

4

1 回答 1

2

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

使用 Java API,除了调用 之外setSourceIndexRequestBuilder您还需要通过调用来提供 id setId。例如:

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

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

无论哪种情况,您都需要向 ES 提供您要修改的文档的 ID。

于 2016-01-31T15:22:19.057 回答