Elasticsearch NEST Повторное использование ElasticClient для другого запроса индекса - PullRequest
0 голосов
/ 13 марта 2019

Как я могу зарегистрировать ElasticClient в качестве синглтона в приложении .NET Core, но все еще в состоянии указать другой индекс во время запроса?

Например:

В Startup.cs я регистрирую объект эластичного клиента как синглтон, упоминая только URL без указания индекса.

public void ConfigureServices(IServiceCollection services)
{
    ....
    var connectionSettings = new ConnectionSettings(new Uri("http://localhost:9200"));
    var client = new ElasticClient(connectionSettings);
    services.AddSingleton<IElasticClient>(client);
    ....
}

Затем при внедрении одноэлементного объекта ElasticClient выше я бы хотел использовать его для разных индексов в 2 разных запросах.

В приведенном ниже классе я хочу сделать запрос из индекса под названием «Apple»

public class GetAppleHandler
{   
    private readonly IElasticClient _elasticClient;

    public GetAppleHandler(IElasticClient elasticClient)
    {
        _elasticClient = elasticClient;
    }

    public async Task<GetAppleResponse> Handle()
    {
        // I want to query (_elasticClient.SearchAsync<>) using an index called "Apple" here
    }
}

Из приведенного ниже кода я хочу сделать запрос из индекса под названием "Orange"

public class GetOrangeHandler
{   
    private readonly IElasticClient _elasticClient;

    public GetOrangeHandler(IElasticClient elasticClient)
    {
        _elasticClient = elasticClient;
    }

    public async Task<GetOrangeResponse> Handle()
    {
        // I want to query (_elasticClient.SearchAsync<>) using an index called "Orange" here
    }
}

Как я могу это сделать? Если это невозможно, можете ли вы предложить другой подход, который позволит мне внедрить ElasticClient с помощью внедрения зависимостей .NET Core и в то же время также позволит мне запрашивать 2 разных индекса одного и того же экземпляра ES?

1 Ответ

1 голос
/ 14 марта 2019

Просто нужно указать индекс по запросу

var defaultIndex = "person";
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));

var settings = new ConnectionSettings(pool)
    .DefaultIndex(defaultIndex)
    .DefaultTypeName("_doc");

var client = new ElasticClient(settings);

var searchResponse = client.Search<Person>(s => s
    .Index("foo_bar")
    .Query(q => q
        .Match(m => m
            .Field("some_field")
            .Query("match query")
        )
    )
);

Здесь запрос поиска будет

POST http://localhost:9200/foo_bar/_doc/_search
{
  "query": {
    "match": {
      "some_field": {
        "query": "match query"
      }
    }
  }
}
  • foo_bar Индекс был определен в запросе поиска
  • _doc тип выведен из глобального правила для DefaultTypeName("_doc")
...