【问题标题】:how to search in unixtime range in NEST?如何在 NEST 的 unix 时间范围内搜索?
【发布时间】:2017-11-30 16:12:29
【问题描述】:

我在 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")));

另外,如果 @timestamp 值不是我的对象模型的一部分,我如何从 Elastic 响应中保存该值?

【问题讨论】:

    标签: .net elasticsearch nest


    【解决方案1】:

    让我看看能不能让你走上正轨。

    我的数据中没有任何时间戳字段,所以我想使用 @timestamp 变量。

    我不明白你在这里的意思。 Elasticsearch 中的数据是否包含名为"@timestamp"date 字段?如果是这样,那么它可以被查询。

    它不一定要映射到 C# POCO 上代表文档的 _source 的属性,但如果您想使用 .NET 中的响应值,这样做可能会有所帮助应用。映射可以通过几种不同的方式完成,但也许最简单的是在这里使用属性

    public class Logs
    {
        public string Color { get; set; }
    
        [Date(Name = "@timestamp")]
        public DateTime Timestamp { get; set; }
    }
    

    若要对 date 字段执行范围查询,请在 NEST 中使用 DateRange 查询

    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")
        )
    );
    

    DateRange 查询可以采用DateMath expressions,它具有从字符串的隐式转换。没有从 NEST 中公开的数值转换,但使用字符串作为 epoch_millis 值应该可以工作。值可以用任何valid date format for Elasticsearch 表示,只需指定Format() 值,Elasticsearch 就会知道如何解析它。

    使用如上映射的"@timestamp"字段,我们可以对时间戳字段使用lambda表达式,使用operator overloading可以更简洁地编写查询

    var searchResponse = client.Search<Logs>(s => s
        .Query(q => q
            .Match(m => m
                .Field(f => f.Color)
                .Query("Red")
            ) && +q
            .DateRange(r => r
                .Field(f => f.Timestamp)
                .GreaterThanOrEquals("1512036771843")
                .LessThan("1512051171843")
                .Format("epoch_millis")
            )
        )
        .Sort(p => p
            .Descending(f => f.Timestamp)
        )
    );
    

    【讨论】:

    • 感谢您的回答!在我意识到 NEST 正在使用 Newtonsoft.JSON 之后,我自己找到了带有 [Date(Name = "@timestamp")] 的解决方案。之后,我只是将前 10 条记录(我猜是默认的 elasticsearch 值)按降序排序,我认为这不是很有效,因为我不敢将“epoch_millis”放入 Format 方法中。另外,方法重叠是一个有点复杂的概念,所以谢谢你的例子。
    猜你喜欢
    • 2019-11-17
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    相关资源
    最近更新 更多