DateRange搜索在Elastic search NEST API中不起作用

时间:2019-07-03 11:56:57

标签: c# elasticsearch nest

我有一个日志记录表,我想按日期进行简单搜索。

例如,我想搜索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
                            }
                        }
                    }
                }
            }
        }
    }
}

1 个答案:

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

希望有帮助。