我正在尝试使用Java Api通过Elastic Search Script更新索引中的多个值。但无法更新字段。
示例代码: -
UpdateResponse response = request.setScript("ctx._source").setScriptParams(scriptParams).execute().actionGet();
UpdateResponse response = request.setScript("ctx._source.").setScriptParams(scriptParams).execute().actionGet();
如果我提到。(点)in(“ctx._source。”)获取illegalArgument Exception并且如果我不使用dot,则不会获得任何异常但值不会在Index中更新。 任何人都可以告诉我解决方案。
答案 0 :(得分:12)
首先,您的脚本(ctx._source
)没有做任何事情,正如其中一位评论者已经指出的那样。如果你想更新字段" a",那么你需要一个像这样的脚本:
ctx._source.a = "foobar"
这将分配字符串" foobar"现场" a"。但是,您可以做的不仅仅是简单的任务。查看文档以获取更多详细信息和示例:
http://www.elasticsearch.org/guide/reference/api/update/
也可以使用一个脚本更新多个字段。您可以使用分号分隔不同的MVEL指令。 E.g:
ctx._source.a = "foo"; ctx._source.b = "bar"
答案 1 :(得分:5)
在弹性搜索中有一个Update Java API。请查看以下代码
client.prepareUpdate("index","typw","1153")
.addScriptParam("assignee", assign)
.addScriptParam("newobject", responsearray)
.setScript("ctx._source.assignee=assignee;ctx._source.responsearray=newobject ").execute().actionGet();
这里,assign变量包含对象值,响应数组变量包含数据列表。
答案 2 :(得分:0)
您可以使用以下代码使用spring java客户端执行相同的操作。我还列出了代码中使用的依赖项。
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.index.query.QueryBuilder;
import org.springframework.data.elasticsearch.core.query.UpdateQuery;
import org.springframework.data.elasticsearch.core.query.UpdateQueryBuilder;
private UpdateQuery updateExistingDocument(String Id) {
// Add updatedDateTime, CreatedDateTime, CreateBy, UpdatedBy field in existing documents in Elastic Search Engine
UpdateRequest updateRequest = new UpdateRequest().doc("UpdatedDateTime", new Date(), "CreatedDateTime", new Date(), "CreatedBy", "admin", "UpdatedBy", "admin");
// Create updateQuery
UpdateQuery updateQuery = new UpdateQueryBuilder().withId(Id).withClass(ElasticSearchDocument.class).build();
updateQuery.setUpdateRequest(updateRequest);
// Execute update
elasticsearchTemplate.update(updateQuery);
}
答案 3 :(得分:0)
XContentType contentType =
org.elasticsearch.client.Requests.INDEX_CONTENT_TYPE;
public XContentBuilder getBuilder(User assign){
try {
XContentBuilder builder = XContentFactory.contentBuilder(contentType);
builder.startObject();
Map<String,?> assignMap=objectMap.convertValue(assign, Map.class);
builder.field("assignee",assignMap);
return builder;
} catch (IOException e) {
log.error("custom field index",e);
}
IndexRequest indexRequest = new IndexRequest();
indexRequest.source(getBuilder(assign));
UpdateQuery updateQuery = new UpdateQueryBuilder()
.withType(<IndexType>)
.withIndexName(<IndexName>)
.withId(String.valueOf(id))
.withClass(<IndexClass>)
.withIndexRequest(indexRequest)
.build();