【问题标题】:How to write date range query in Nest ElasticSearch client?如何在 Nest ElasticSearch 客户端中编写日期范围查询?
【发布时间】:2014-10-27 01:49:37
【问题描述】:

我有一个 .Net 应用程序试图从弹性搜索文档存储中获取数据,记录的结构如下:

{
  "_index": "TestIndex",
  "_type": "amqp",
  "_id": "123",
  "_source": {
    "@timestamp": "2014-10-27T01:31:54.780Z",    
    "type": "amqp",        
    "LogGenerationTime": "2014-10-26T21:31:54.780",    
    "ThreadID": "6",
    "ProcessID": "8136",
    "SessionID": "xyz",
    "UserID": "12345678",
  },  
}

我想在过去 20 分钟内使用 LogGenerationTime 获取所有记录。这是我到目前为止编写的查询,但它似乎没有返回任何数据:

    var format = "yyyy-MM-dd'T'HH:mm:ss.fff";
    var lowerBound = DateTime.Now.AddMinutes(-20);
    ISearchResponse<Amqp> resultSet = _elasticSearchClient.Search<Amqp>(q => q.Query
                    (p => p.Range
                        (v => v.OnField
                            (x => x.LogGenerationTime).GreaterOrEquals(lowerBound, format))));

有人可以帮助编写正确的查询以获取预期结果吗?谢谢!

【问题讨论】:

  • 您的查询看起来非常正确。我建议使用 fiddler 查看它发送给 ES 的 json 以尝试确定问题。

标签: c# .net lambda elasticsearch nest


【解决方案1】:

查看源码,OnField 方法有两个重载。当我使用带有 Linq 表达式参数的 时,查询不返回任何数据。但是我能够使它与另一个重载一起工作,它采用字符串值,我将弹性搜索文档的字段名称作为字符串传递。以下是返回预期结果的查询:

var resultSet = _elasticSearchClient.Search<Amqp>(q => q.Query
                (p => p.Range(v => v.OnField("LogGenerationTime").GreaterOrEquals(lowerBound))).Size(10000));

看起来像框架中的一个错误,但不完全确定。

【讨论】:

【解决方案2】:

以下代码适用于我:

Range(r => r.GreaterOrEquals(lowerBound).Format("MM/dd/yyyy").OnField(LogTime))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    相关资源
    最近更新 更多