ElasticSearch NEST - используйте UpdateByQuery для создания несуществующего поля или обновления существующего - PullRequest
2 голосов
/ 15 марта 2019

Я довольно новичок вasticsearch (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 все работает просто отлично.Однако, если я попытаюсь использовать тот же метод для ADD поля к документу , ничего не произойдет , запрос вернет «действительный ответ на гнездо, созданный из успешного низкоуровневого вызова по почте», идвижется дальше.

Я попытался повторить тот же запрос и выполнить его в 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"
              }
            }
          }
        ]
...