c# Elastic.Clients.Elasticsearch 动态查询

ElasticsearchClientSettings elasticsearchClientSettings = new ElasticsearchClientSettings(new StaticNodePool(urls.Select((string h) => new Uri(h)).ToArray())).Authentication(new BasicAuthentication(username, password));
  if (!string.IsNullOrWhiteSpace(defaultIndex))
  {
      elasticsearchClientSettings.DefaultIndex(defaultIndex);
  }

  var client=  new ElasticsearchClient(elasticsearchClientSettings);
  var query = BuildQueryDescriptor(dto);
  var data = client.SearchAsync<LogEntity>(s => s
                                .Indices(LogDocumentName)
                                .From((dto.PageIndex - 1) * dto.PageSize)
                                .Size(dto.PageSize)
                                .Query(query)
                                );
  data.Wait();


 private Action<QueryDescriptor<LogEntity>> BuildQueryDescriptor(LogSearchInDto condition)
 {
     var mustQueries = new List<Action<QueryDescriptor<LogEntity>>>
     {
     };
     // StartDate
     if (condition.StartTime.HasValue)
     {
         // 时区已经是UTC, ELK中的时区也是UTC, 直接使用即可,否则需转时区
         mustQueries.Add(m =>
             m.Range(r =>
                 r.Date(d =>
                     d.Field(i => i.LogTime).Gte(DateMath.Anchored(condition.StartTime.Value)))));
     }
     // EndDate
     if (condition.EndTime.HasValue)
     {
         mustQueries.Add(m =>
             m.Range(r =>
                 r.Date(d =>
                     d.Field(i => i.LogTime).Lte(DateMath.Anchored(condition.EndTime.Value)))));
     }

     // 关键字检索SearchText
     if (!string.IsNullOrWhiteSpace(condition.Keywords))
     {
         mustQueries.Add(m => m.Match(c => c.Field("body.keyword").Query(condition.Keywords)));
     }

     Action<QueryDescriptor<LogEntity>> retQuery = q => q.Bool(b => b.Filter(mustQueries.ToArray()));

     return retQuery;
 }
posted @ 2026-03-03 17:48  Hey,Coder!  阅读(0)  评论(0)    收藏  举报