【问题标题】:NEST elasticsearch DateRange queryNEST elasticsearch DateRange 查询
【发布时间】:2017-05-03 14:26:34
【问题描述】:

我正在尝试使用 NEST api 在预定义的日期范围内从 elasticsearch 获取结果,但我无法管理。这个示例代码我试图检索一周的数据,但它忽略了我的日期过滤器并返回比我的初始日期更旧的数据。

提前感谢您的帮助!

var node = new Uri("http://localhost:9200");
var settings = new ConnectionSettings(node);
var client = new ElasticClient(settings);

settings.DefaultIndex("wholelog-2017.04*");

client.CreateIndex("wholelog-2017.04*",
create => create.Mappings(
    mappings => mappings.Map<LogLine>(type => 
        type.AutoMap()
        )
        ));

DateTime InitDate = DateTime.Now.AddDays(-7);

var filterClauses = new List<QueryContainer>();

filterClauses.Add(new DateRangeQuery
{
     Field = new Field("logTime"),
     LessThanOrEqualTo = DateTime.Now,
     GreaterThanOrEqualTo = InitDate
});

var searchRequest = new SearchRequest<LogLine>()
{
     Size = 10000,
     From = 0,
     Scroll = "1m",
     Query = new BoolQuery
     {
           Filter = filterClauses
     }
};

var searchResult = client.Search<LogLine>(searchRequest);


[ElasticsearchType(Name="logLine")]
public class LogLine
{
    public string Message {get;set;}
    public DateTime logTime {get;set;}
    public string type {get;set;}
    public string logServer {get;set;}
}

logstash 配置文件

output {
    elasticsearch{
       hosts => "localhost"
       #user => ####
       #password => ####
       index => "wholelog-%{+YYYY.MM.dd}"
    } 
}

【问题讨论】:

  • 您能提供您对此查询的映射和响应吗?
  • 感谢您的帮助,我添加了映射。它是一个自动填充的 POCO 类。我已经尝试过 DateMath 和 DateTime ,结果相同。数据被正确映射,我可以通过调试看到对象 LogLine 已正确填充。我不知道为什么日期查询不起作用...

标签: elasticsearch nest


【解决方案1】:

我假设您没有明确放置映射,只是开始将文档添加到索引中。尝试像这样创建一个新索引

client.CreateIndex(indexName,
    create => create.Mappings(
        mappings => mappings.Map<LogLine>(
            type => type.AutoMap()
        )
    )
);

并在您的领域使用DateTimeDateMath 用于构建搜索查询

[ElasticsearchType(Name = "logLine")]
public class LogLine
{
    public string Message { get; set; }
    public DateTime logTime { get; set; }
    public string type { get; set; }
    public string logServer { get; set; }
}

在明确放置映射后,尝试添加文档并搜索新索引。

【讨论】:

  • 感谢 Random 的帮助,我想我快到了,但仍然无法正常工作。我已经根据您的建议更新了代码,并尝试了使用 NEST 文档的许多不同方法,但是应用了过滤器 GreaterThanOrEqualTo 我仍然没有得到任何文档。我也在我的第一条评论中更新了代码,以防你看到我做错了什么。再次感谢!
  • 我无法使用您示例中的名称创建索引,因为它包含 * 字符。但是,如果我创建一个具有不同名称的索引,例如 my_index,它会按预期过滤我的文档。请检查 ServerError 属性以获取 NEST 客户端返回的对象。如果一切正常并且您的索引名称也可以,请添加您的代码以用于索引文档
  • 我这样做是因为我使用 logstash 将数据插入到 elasticsearch 中。生病将代码添加到原始评论中以显示我的索引是如何创建的。
  • 我认为我必须使用 *,因为我每天有一个索引并且我正在寻找一整月的数据
  • 好的,我的问题实际上是由logstash创建的默认映射。谢谢随机。
猜你喜欢
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 2014-07-02
相关资源
最近更新 更多