ElasticSearch NEST-使用UpdateByQuery创建不存在的字段或更新现有的字段

时间:2019-03-15 20:25:38

标签: elasticsearch nest elasticsearch-6 elasticsearch-query

我是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"
              }
            }
          }
        ]

0 个答案:

没有答案