我正在尝试在使用NEST API的 flex 搜索中使用日期范围搜索。
我知道ES在与Nlog集成时将时间戳存储在UTC中。
但是,我需要在此@timestamp字段中进行日期范围搜索。
我写了以下查询:
从日期搜索:
qcd.DateRange(r => r
.Field(f => f.timestamp)
.GreaterThanOrEquals(searchFromDateTime)
.TimeZone("+02:00")
);
迄今为止的搜索:
qcd.DateRange(r => r
.Field(f => f.timestamp)
.LessThanOrEquals(searchToDateTime)
.TimeZone("+02:00")
);
这是查询的其余部分:
searchResponse = (SearchResponse<SearchEventDto>)client.Search<SearchEventDto>(s => s
.Index("logstash-*")
.Type("logevent")
.Query(q => qcd)
);
SearchFromDateTime或SearchToDateTime是C#日期。
显然,查询中存在问题,因为它没有考虑时差。
例如,由于我是欧洲中部时间,因此如果我提供28.06.2019 14:48作为``搜索起始日期'',则应从28.06.2019 12:48开始搜索。或者,在“搜索到”日期中也应如此。
任何想法,我怎么能做到这一点?
最佳答案
我已经为您准备了一个有效的示例,也许您可以在您的情况下找到问题。如果不是,请使用您希望在查询中找到的样本文档来更新问题。
class Program
{
public class Document
{
public int Id { get; set; }
public DateTime Timestamp { get; set; }
}
static async Task Main(string[] args)
{
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var connectionSettings = new ConnectionSettings(pool);
connectionSettings.DefaultIndex("documents");
//only for debbuging purpose, don't use in production
connectionSettings.DisableDirectStreaming();
connectionSettings.PrettyJson();
var client = new ElasticClient(connectionSettings);
await client.Indices.DeleteAsync("documents");
await client.Indices.CreateAsync("documents");
var response = await client.IndexAsync(
new Document {Id = 1, Timestamp = new DateTime(2010, 01, 01, 10, 0, 0)}, descriptor => descriptor);
var searchResponse = await client.SearchAsync<Document>(s => s
.Query(q => q
.Bool(b => b
//I'm using date range in filter context as I don't want elasticsearch
//to calculate score for each document found,
//should be faster and likely it will be cached
.Filter(f =>
f.DateRange(dt => dt
.Field(field => field.Timestamp)
.LessThanOrEquals(new DateTime(2010, 01, 01, 11, 0, 0))
.TimeZone("+1:00"))))));
//prints 1
Console.WriteLine(searchResponse.Documents.Count);
}
}
希望能有所帮助。
关于c# - 使用NEST API进行日期范围搜索以进行 Elasticsearch ,返回不适当的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56901010/