Использование HttpClient для выполнения поиска по api с подсчетом запросов Elasticsearch

#c# #elasticsearch #httpclient #querydsl

Вопрос:

Я хочу использовать httpclient для выполнения GET /count в elasticsearch, чтобы возвращать количество обращений на основе поиска по запросу. Тем не менее, я застрял на попытке получить значение, внутри jsonData которого содержится следующее, при отладке и наведении курсора jsonData :

 {{
  "count": 91,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  }
}}
 

Я знаю, что это можно сделать с помощью api count с NEST. Но я хочу сделать это с помощью httpclient. Поэтому я попробовал следующее, но когда я установил count = contents.Count() , он возвращает 72, а не 91.

        var countQuery = "{ "query": { "bool": { "should": [ { "match": { "fields.User": "jukl" } } ], "filter": [ {"  
            " "range": { "@timestamp": { "gte": "2021-07-01T00:00:00.000-05:00", "lt": "2021-07-31T23:59:59.999-05:00" } } } ],"  
            " "minimum_should_match": 1 } } }";


      
 

Как мне назначить count , чтобы сохранить значение 91?

Ответ №1:

В самой документации elastic для .NET говорится, что не рекомендуется использовать HttpClient для использования. Правильным было бы использовать инъекцию зависимостей, как в примере ниже:

 public static void AddElasticsearch(this IServiceCollection services, IConfiguration configuration)
{
    var settings = new ConnectionSettings(new Uri(configuration["ElasticsearchSettings:uri"]));

    var defaultIndex = configuration["ElasticsearchSettings:defaultIndex"];

    if (!string.IsNullOrEmpty(defaultIndex))
        settings = settings.DefaultIndex(defaultIndex);

    var basicAuthUser = configuration["ElasticsearchSettings:username"];
    var basicAuthPassword = configuration["ElasticsearchSettings:password"];

    if (!string.IsNullOrEmpty(basicAuthUser) amp;amp; !string.IsNullOrEmpty(basicAuthPassword))
        settings = settings.BasicAuthentication(basicAuthUser, basicAuthPassword);

    var client = new ElasticClient(settings);

    services.AddSingleton<IElasticClient>(client);
}
 

Затем используйте приведенный ниже код, чтобы получить общее количество записей:

 var search = new SearchDescriptor<T>(IndexName).MatchAll();
var response = await _elasticClient.SearchAsync<T>(search);
if (response.IsValid)
{
    return response.Total;
}
 

Ссылка: https://github.com/hgmauri/elasticsearch-with-nest

Комментарии:

1. Если вы не возражаете, не могли бы вы, пожалуйста, поделиться со мной документацией для . СЕТЬ, которая говорит об этом. Я хотел бы подробнее разобраться в этом. Таким образом, вы делаете то же самое, что и с помощью NEST, но динамически правильно?

2. Перейдите по ссылке: elastic.co/guide/en/elasticsearch/client/net-api/current/… И да, правильно всегда использовать Elastic в .NET с пакетом NEST, чтобы знать, как работать с соединениями с elastic.

3. Я не вижу, где в предоставленной вами статье сказано не использовать httpclient? В обновленном посте это динамично?

4. Фактически, в документации указано использование NEST, поскольку он управляет подключением к elasticsearch, что делает ваше приложение более производительным. Внутренне NEST использует HttpClientFactory для управления подключениями: thinkrethink.net/2018/07/25/…

5. @MarkCo Если вы действительно собираетесь использовать HttpClient, я предлагаю использовать HttpClient для управления вашими подключениями, таким образом вы избежите утечки памяти