Как удалить значение поля из документа Elasticsearch с помощью NEST? - PullRequest
0 голосов
/ 01 декабря 2018

Я использую Nest для вставки / обновления документов в Elasticsearch.Вот пример класса POCO, который я использую для сопоставления документа ...

public class MyClass
{
    public string Id { get; set; }
    public decimal? MyField { get; set; }
}

Это работает, как и ожидалось ... Когда я добавляю документ, если у поля nullable MyField есть значение, этовернулся в JSON.Если поле Nullable не имеет значения, оно не возвращается в _source JSON, потому что нулевые значения не сохраняются.

Однако в некоторых случаях мне может потребоваться обновить single документ и удалить значение из одного поля.То есть, когда я впервые вставляю документ, MyField имеет значение и возвращается в результате JSON Elasticsearch.Затем, по какой-либо причине, мне нужно удалить это значение.

Я использую частичные обновления документов и, если возможно, предпочел бы сохранить его таким.(Полная модель документа, которую я использую, будет иметь более 100 полей, а мой индекс со временем будет иметь более 100 млн. Записей.) Итак, я ищу наиболее эффективный способ частичного обновления документов.

Спасибозаранее!

1 Ответ

0 голосов
/ 01 декабря 2018

Подумайте, как бы вы это сделали, просто используя API?Есть несколько способов.например, вот так:

// kibana version
POST my_index/_update_by_query
{
  "query": {
    "ids": {
      "values": [
        "12345"
      ]
    }
  },
  "script": {
    "source": "ctx._source.myField = null"
  }
}

// nest version
var response = client.UpdateByQuery<CustomerDto>(u => u
    .Query(q => q
        .Ids(i => i.Values(12345))
    )
    .Script("ctx._source.flag = null")
    //.Conflicts(Conflicts.Proceed)
    .Refresh(true)
);

или вот так:

// kibana version
POST my_index/my_type/12345/_update
{
  "script": {
    "source": "ctx._source.remove('myField')"
  }
}

// nest version
var response = client.Update<CustomerDto>(
    new UpdateDescriptor<CustomerDto, CustomerDto>("index_name", "type", 12345)
        .Script(s => s.Source("ctx._source.remove('middleName')")));
...