API обновления Elastic Search по сценарию в NEST 6.5.4 для - PullRequest
0 голосов
/ 16 апреля 2019

Я использую Nest 6.5.4.Я не могу выполнить обновление с помощью скрипта для определенного документа в индексе.Я пробовал много способов, но я получаю синтаксическую ошибку.Мой запрос выглядит следующим образом.

var clientProvider = new ElasticClientProvider();
var projectModel = new ProjectModel();
 var res = clientProvider.Client.Update<ProjectModel>(projectModel, i => i
                .Index("attachment_index")
                .Type("attachments")
                .Id(projectId)
.Script(script=>script.Source("ctx._source.fileInfo.fileViewCount= ctx._source.fileInfo.fileViewCount + 1"))
                );

Выдает ошибку "Дескриптор обновления не имеет определения для Id" Тот же запрос работает при попытке в Kibana

POST attachment_index/attachments/1/_update
{
  "script": {
    "source":"ctx._source.fileInfo.fileViewCount += 1"
  }
}

Iне знаю, где я получаю ошибку.

Ответы [ 2 ]

1 голос
/ 07 мая 2019
client.UpdateAsync<ProjectModel, object>(
                new DocumentPath<ProjectModel>(id),
                u => u
                    .Index(ConfigurationManager.AppSettings.Get("indexname"))
                    .Type(ConfigurationManager.AppSettings.Get("indextype"))
                    .Doc(ProjectModel)
                    .DocAsUpsert()
                    .Refresh(Elasticsearch.Net.Refresh.True));

Это сработает, и дайте мне знать, если у вас все еще есть какие-либо проблемы.

1 голос
/ 17 апреля 2019

В UpdateDescriptor<T, TPartial> отсутствует метод .Id(), поскольку идентификатор является обязательным параметром для вызова API обновления, поэтому это ограничение применяется через конструкторы.

Первыйпараметр .Update<T>(...) представляет собой DocumentPath<T>, из которого можно получить индекс, тип и идентификатор для вызова API обновления.Если ProjectModel CLR POCO имеет свойство Id со значением, оно будет использоваться для идентификатора вызова.Например,

public class ProjectModel 
{
    public int Id { get; set; }
}

var client = new ElasticClient();

var projectModel = new ProjectModel { Id = 1 };

var updateResponse = client.Update<ProjectModel>(projectModel, i => i
    .Index("attachment_index")
    .Type("attachments")
    .Script(script => script
        .Source("ctx._source.fileInfo.fileViewCount= ctx._source.fileInfo.fileViewCount + 1"))
);

, что приводит к

POST http://localhost:9200/attachment_index/attachments/1/_update
{
  "script": {
    "source": "ctx._source.fileInfo.fileViewCount= ctx._source.fileInfo.fileViewCount + 1"
  }
}

Если вы хотите явно указать Id, вы можете передать значение для DocumentPath<T>

var updateResponse = client.Update<ProjectModel>(1, i => i
    .Index("attachment_index")
    .Type("attachments")
    .Script(script => script
        .Source("ctx._source.fileInfo.fileViewCount= ctx._source.fileInfo.fileViewCount + 1"))
);
...