我有一个日志记录表,我想按日期进行简单搜索。
例如,我想搜索2019年1月6日00:00:00(mm.DD.yyyy hh:mm:ss)之前的所有查询,我编写了以下查询:
var query = client.Search<SearchEventDto>(s => s
.AllIndices()
.AllTypes()
.Query(q => q
.MatchAll() && +q
.DateRange(r =>r
.Field(f => f.timestamp)
.LessThanOrEquals(new DateTime(2019,06,01, 0, 0, 0))
)
)
);
我的Dto看起来像这样:
public class SearchEventDto : IDto
{
[KendoColumn(Hidden = true, Editable = true)]
public string id { get; set; }
[KendoColumn(Order = 2, DisplayName = "Level")]
public string level { get; set; }
[KendoColumn(Order = 4, DisplayName = "Message")]
public string message { get; set; }
[KendoColumn(Hidden = true)]
public string host { get; set; }
[KendoColumn(Order = 3, DisplayName = "Source")]
public string src { get; set; }
[KendoColumn(Order = 1, DisplayName = "Timestamp", UIType = UIType.DateTime)]
public DateTime timestamp { get; set; }
[KendoColumn(Hidden = true)]
public DateTime time { get; set; }
}
不幸的是,它返回所有记录而不过滤任何内容。 我在哪里出错了?
谢谢!
PS:ES版本:6.7.0,NEST:6.8
PS:我已经将日志与Nlog集成在一起。因此,现在每天都会插入一个以日期为名称的新索引。这是219-06-28的映射(我正在使用@timestamp):
{
"logstash-2019-06-28": {
"mappings": {
"logevent": {
"properties": {
"@timestamp": {
"type": "date"
},
"host": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"level": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"message": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"src": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"time": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}
答案 0 :(得分:2)
我将发表在评论中的内容作为答案,因为我认为可以改进一些方面以提高性能和可读性。
解决方案:
该问题的查询使用的是df = df.set_index(['ID', 'Car', 'Start', 'Finish'])
res = (df.where(df.ne(0))
.clip(1,1)
.interpolate(axis=1, limit_area='inside')
.fillna(0, downcast='infer')
.reset_index())
,该内容已由NEST翻译为使用.Field(f => f.timestamp)
字段而不是timestamp
。只需更改为@timestamp
即可解决问题,因为这是索引映射中正确的字段名称。
.Field("@timestamp")
我们还可以使用{
"logstash-2019-06-28": {
"mappings": {
"logevent": {
"properties": {
"@timestamp": {
"type": "date"
},
..
}
}
}
}
}
属性标记timestamp
属性,以告诉NEST使用PropertyName
代替@timestamp
作为名称
timestamp
并查询
public class SearchEventDto : IDto
{
[KendoColumn(Order = 1, DisplayName = "Timestamp", UIType = UIType.DateTime)]
[PropertyName("@timestamp")]
public DateTime timestamp { get; set; }
}
也将正常工作。
改进:
仅查询特定索引:
var query = client.Search<SearchEventDto>(s => s
.AllIndices()
.AllTypes()
.Query(q => q
.MatchAll() && +q
.DateRange(r =>r
.Field(f => f.timestamp)
.LessThanOrEquals(new DateTime(2019,06,01, 0, 0, 0))
)
)
);
通过使用var query = client.Search<SearchEventDto>(s => s
.AllIndices()
.AllTypes()
..
,我们告诉elasticsearch尝试从所有索引中收集文档,我们可以对其进行一些更改以仅查询带有日志数据的索引:
AllIndices()
将过滤器上下文用于日期范围过滤器:
var query = client.Search<SearchEventDto>(s => s
.Index("logstash-*")
.Type("logevent")
..
这样,您的查询应该会更快,因为它无需考虑计算搜索相关性得分。您可以详细了解here。
希望有帮助。