#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;
}
Комментарии:
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 для управления вашими подключениями, таким образом вы избежите утечки памяти