Nest ElasticClient с несколькими индексами для индексации документа - PullRequest
1 голос
/ 03 августа 2020

Сначала у меня был 1 индекс, и мой elasticclient был настроен, как показано ниже, в моем startup.cs

public static IServiceCollection AddElasticClient(this IServiceCollection services)
{
    var elasticSettings = services.BuildServiceProvider().GetService<IOptions<ElasticSettings>>().Value;

    var settings = new ConnectionSettings(new Uri(elasticSettings.Uri));
    settings
        .ThrowExceptions(elasticSettings.ThrowExceptions)
        .PrettyJson(elasticSettings.PrettyJson)
        .DefaultIndex(elasticSettings.Index)
        .BasicAuthentication(elasticSettings.Username, elasticSettings.Password)
        .DefaultMappingFor<CorrelationContext>(ms => ms.Ignore(p => p.DgpHeader));

    var client = new ElasticClient(settings);

    services.AddSingleton<IElasticClient>(client);

    return services;
}

Мой писатель выглядит как

public class ElasticWriter : IElasticWriter
{
    private readonly IElasticClient _elasticClient;

    public ElasticWriter(IElasticClient elasticClient)
    {
        _elasticClient = elasticClient ?? throw new ArgumentNullException(nameof(elasticClient));
    }

    public void Write(AuditElasticDoc doc)
    {
        var indexResponse = _elasticClient.IndexDocument(doc);

        if (!indexResponse.IsValid)
        {
                throw indexResponse.OriginalException ?? new Exception("Invalid Elastic response when writing document.");
        }
    }

}

Теперь есть новое требование от которым они могут предоставить имя индекса для записи. Все данные аутентификации для разных индексов предоставляются через настройки конфигурации, поэтому у меня все доступно при запуске. Тип документа всегда один и тот же.

Я нашел примеры указания индекса при запросе, но не при индексировании.

Могу ли я предоставить несколько индексов в моем ElasticClient и указать индекс при выполнении IndexDocument ? Или мне нужен отдельный клиент для каждого индекса?

Если последнее, есть ли способ, которым я все еще могу использовать DI для внедрения клиента в мой писатель, или мне нужно создать его там на месте?

Thx.

Я использую Nest 7.6.1

1 Ответ

1 голос
/ 03 августа 2020

Вместо использования IndexDocument вы можете использовать метод IndexAsync, который позволит вам управлять дополнительными параметрами запроса.

var indexResponse = await _elasticClient.IndexAsync(doc, descriptor => descriptor.Index("other"));

IndexDocument - это метод-оболочка, скрывающий сложность индексирования документов от клиентов. Посмотрите .

Запросить конфигурацию аутентификации

var indexResponse = await _elasticClient.IndexAsync(doc, 
    descriptor => descriptor
        .Index("other")
        .RequestConfiguration(rq => rq.BasicAuthentication("user", "pass")));
...