说明:
-
C#的elastic client通过ConnectionSettings来指定es server的地址
-
C#的Request有多种类型封装,比如Search相关的封装SearchRequest, GetAlias相关的GetAliasRequest, Count相关的CountRequest, ping相关的PingRequest等。 即,es默认支持的关键字都有对应的request
-
C#的Query有matchQuery、DateRangeQuery等, 相互之间用条件运算符可以组合查询, 最终生成的restful 请求头转换为bool query了
-
C#的Aggregation也有TermsAggregation、DateHistogramAggregation等, 用来普通分类和时间分类等, 不像js,需要自己用字符串指定。 返回值也要在Aggregations里查看。
public
async
Task<IReadOnlyCollection<DateHistogramBucket>> GetScanPatientStatistics(
string
systemID,
string
startDate,
string
endDate, DateInterval dateInterval,
string
indices =
"*scanstatistics*"
)
{
var
client = GetClient();
var
filterPath =
new
string
[] {
"aggregations.*.buckets"
};
var
request =
new
SearchRequest(indices)
{
Query =
new
MatchQuery() { Field =
"systemID"
, Query = systemID }
&&
new
DateRangeQuery() { Field =
"timeStamp"
, GreaterThanOrEqualTo = startDate, LessThanOrEqualTo = endDate, Format =
"yyyyMMdd"
},
Aggregations =
new
DateHistogramAggregation(
"agg_date_histogram_timeStamp"
)
{
Field =
"timeStamp"
,
Interval = dateInterval,
Format =
"yyyy-MM-dd HH:mm:ss"
,
Aggregations =
new
ValueCountAggregation(
"agg_count_systemID"
,
"systemID.keyword"
)
},
FilterPath = filterPath
};
var
response =
await
client.SearchAsync<CTDMS<CTDMSItem>>(request);
var
dateHistogram = response.Aggregations.DateHistogram(
"agg_date_histogram_timeStamp"
);
return
dateHistogram.Buckets;
}
-
Buckets可以转为Dictionary
public
async
Task<Dictionary<DateTime,
double
?>> GetScanPatientStatistics(
string
systemID, DateRangeEnum dateRange, DateInterval dateInterval,
string
indices =
"*scanstatistics*"
)
{
var
buckets =
await
GetScanPatientStatistics(systemID, DateRangeEnumExtensions.ToString(dateRange),
"now"
, dateInterval, indices);
return
buckets.ToDictionary(k => k.Date, v => v.Values.OfType<ValueAggregate>().First().Value);
}
-
C#对于各种查询都有数据类型校验, 这点和js api不相同, 因此必须指定类型
代码如下:
namespace My.ElasticSearch
{
/// <summary>
/// sample code 如下:
/// var search = new SearchDomainService();
//获取当月的每天温度
/*
var result = search.GetDetectorTemp("987654321098",
DetectorEnum.DetectorTempL,
DateRangeEnum.CurrentMonth,
DateInterval.Day).GetAwaiter().GetResult();
*/
//获取当前es中的所有index
/*
var indices = search.GetIndices().GetAwaiter().GetResult();
*/
//当前服务是否ok
/*
var isAvailable = search.IsAvailable().GetAwaiter().GetResult();
*/
//获取扫描量
/*
var count = search.GetScanCount("987654321098", "now/y").GetAwaiter().GetResult();
*/
//获取每一类部位的扫描量
/*
var stat = search.GetScanBodypartStatistics("987654321098", DateRangeEnum.CurrentYear).GetAwaiter().GetResult();
*/
//获取最后一次上传日志的时间
/*
var date = search.GetLatestUploadTime("987654321098").GetAwaiter().GetResult();
*/
/*
var date = search.GetLatestUploadTime<CTScanStatistics<CTScanStatisticsItem>, CTScanStatisticsItem>("987654321098").GetAwaiter().GetResult();
*/
/// </summary>
public class ElasticSearchDomainService
{
private ConnectionSettings _connectionSettings;
private ElasticClient _client = null;
public ElasticSearchDomainService()