如何在NEST的unixtime范围内搜索?

时间:2017-11-30 16:12:30

标签: .net elasticsearch nest

我在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值?

1 个答案:

答案 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"