我是Elasticsearch(6.6.0)的新手,我想实现一个查询,该查询可以基于自定义字段创建/更新文档。
这是我的文档结构
{
"_index" : "document",
"_type" : "_doc",
"_id" : "nvs9gmkB0wioRAGjGGVA",
"_score" : 1.0,
"_source" : {
"customId" : "4a3e7b21-9be9-4378-98ec-aa3e9f40aee7",
"title" : "test",
}
}
使用NEST(最新已知的nuget包),我构建了以下方法来添加/更新文档中的字段
var response = await _client.UpdateByQueryAsync < dynamic > (s => s
.Index("document")
.Type("_doc")
.Query(q => q.Match(t => t
.Field("customId")
.Query("4a3e7b21-9be9-4378-98ec-aa3e9f40aee7")
))
.Script(sc => sc
.Source("ctx._source." + PARAMETER_NAME + " = params." + PARAMETER_NAME)
.Params(p => p
.Add(PARAMETER_NAME, PARAMETER_VALUE)
)
.Lang(ScriptLang.Painless)
)
.RequestsPerSecond(-1)
.WaitForCompletion()
.Refresh()
).ConfigureAwait(false);
if (!response.IsValid) {
//error logic goes here
}
return response;
如果我尝试使用具有给定customId的文档标题更新的方法,一切正常。 但是,如果我尝试使用相同的方法添加文档的字段什么都没有发生,查询将返回“有效的嵌套响应,该响应是通过成功的低级别调用生成的”并继续前进。
我试图复制相同的查询并在kibana上执行它,并且工作正常,更新文档,这是查询:
POST document/_doc/_update_by_query?requests_per_second=-1&wait_for_completion=true&refresh=true
{
"query": {
"match": {
"customId": {
"query": "4a3e7b21-9be9-4378-98ec-aa3e9f40aee7"
}
}
},
"script": {
"lang": "painless",
"params": {
"datetime": "2019-03-15T11:44:43.555Z"
},
"source": "ctx._source.datetime = params.datetime"
}
}
这时我很迷路,我想念什么?
谢谢。
PS :文档很可能会随着时间而变化,为了处理我已经为我所有文档创建的模板,一旦创建了文档索引,便具有以下动态模板:
"dynamic_templates" : [
{
"string_fields" : {
"match" : "*",
"path_unmatch" : "customId",
"match_mapping_type" : "string",
"mapping" : {
"analyzer" : "autocomplete",
"search_analyzer" : "autocomplete_search",
"type" : "text"
}
}
}
]