我在Kibana中测试了一个简单的请求,并希望使用NEST将其转换为代码。
{
"sort": [
{
"@timestamp": {
"order": "desc"
}
}
],
"query": {
"bool": {
"must": [
{
"match" : {
"color" : {
"query": "red"
}
}
},
{
"range": {
"@timestamp": {
"gte": 1512036771843,
"lte": 1512051171843,
"format": "epoch_millis"
}
}
}
]
}
}
}
我的数据中没有任何时间戳字段,所以我想使用@timestamp变量。出于某种原因,Kibana使用unixtime进行搜索,所以我只是从主要的Kibana窗口搜索中复制了它。
现在我正在尝试使用NEST重现相同的请求,并且只能获得
{
"sort":[
{
"@timestamp":{
"order":"desc"
}
}
],
"query":{
"bool":{
"must":[
{
"match":{
"color":{
"query":"red"
}
}
}
],
"filter":[
{
"range":{
"@timestamp":{
"gte":1512042533.022923,
"lt":1512056933.022923
}
}
}
]
}
}
}
这是对Elastic的无效查询。这是我的代码:
var searchResponse = _client.Search<Logs>(s => s
.Query(q => q.Bool(b=>b.Must(mu=>mu.Match(m =>m.Field(f => f.Color).Query("Red")))
.Filter(fi => fi.Range(r => r.Field("@timestamp").GreaterThanOrEquals(rangeTime).LessThan(currentTime)))))
.Sort(p => p.Descending("@timestamp")));
另外,如果此值不是我的对象模型的一部分,如何从Elastic响应中保存@timestamp值?
答案 0 :(得分:0)
让我看看能不能让你走上正轨。
我的数据中没有任何时间戳字段,因此我想使用@timestamp变量。
我不明白你的意思。 Elasticsearch中的数据是否包含名为date
的{{1}}字段?如果是这样,那么可以查询它。
它不一定必须映射到C#POCO上代表文档"@timestamp"
的属性,但如果您愿意使用该属性,则可能有助于这样做.NET应用程序的响应值。映射可以通过几种不同的方式完成,但最简单的方法是使用此处的属性
_source
要在public class Logs
{
public string Color { get; set; }
[Date(Name = "@timestamp")]
public DateTime Timestamp { get; set; }
}
字段上执行范围查询,请使用NEST中的date
查询
DateRange
DateRange查询可以使DateMath
expressions具有来自字符串的隐式转换。在NEST中公开的数值没有转换,但使用var searchResponse = client.Search<Logs>(s => s
.Query(q => q
.Bool(b => b
.Must(mu => mu
.Match(m => m
.Field(f => f.Color)
.Query("Red")
)
)
.Filter(fi => fi
.DateRange(r => r
.Field("@timestamp")
.GreaterThanOrEquals("1512036771843")
.LessThan("1512051171843")
.Format("epoch_millis")
)
)
)
)
.Sort(p => p
.Descending("@timestamp")
)
);
值的字符串应该有效。值可以用任何valid date format for Elasticsearch表示,只需指定epoch_millis
值,以便Elasticsearch知道如何解析它。
如上所述映射Format()
字段,我们可以将lambda表达式用于时间戳字段,使用operator overloading可以更简洁地编写查询
"@timestamp"