C# 弹性嵌套日期范围查询似乎相对较慢
我不熟悉弹性。出于专业原因,我正在尝试进行概念验证。到目前为止,我印象深刻。我已经为一堆数据编制了索引,并运行了一些查询——几乎所有的查询都是超级快速的C# 弹性嵌套日期范围查询似乎相对较慢,c#,elasticsearch,asp.net-core,nest,elastic-stack,C#,elasticsearch,Asp.net Core,Nest,Elastic Stack,我不熟悉弹性。出于专业原因,我正在尝试进行概念验证。到目前为止,我印象深刻。我已经为一堆数据编制了索引,并运行了一些查询——几乎所有的查询都是超级快速的 我遇到的唯一问题是,与所有其他查询相比,我的日期范围查询似乎相对较慢。我们所说的1000ms+与相比,尽管如此,这似乎是一个数据结构优化问题: 在不做太多更改的情况下,您可以将所有可用日期转换为Unix时间戳,然后使用C语言中的快速转换技巧 另一种方法是创建每月或每周、每年的索引,具体取决于您的数据索引,并在执行查询之前过滤掉索引,即仅查询您需
我遇到的唯一问题是,与所有其他查询相比,我的日期范围查询似乎相对较慢。我们所说的1000ms+与相比,尽管如此,这似乎是一个数据结构优化问题: 在不做太多更改的情况下,您可以将所有可用日期转换为Unix时间戳,然后使用C语言中的快速转换技巧 另一种方法是创建每月或每周、每年的索引,具体取决于您的数据索引,并在执行查询之前过滤掉索引,即仅查询您需要的索引。这意味着根据可用性的月/日,将相同的列表放入多个索引中,并在多个索引中复制文档 在ES中,按照一定的索引粒度分离时间戳时间序列数据是一种常见的做法。更多信息 后者意味着您将根据DateTime字段而不是时间戳数组进行过滤
我个人会选择第二个选项。您正在做一个.First,我认为这意味着只有dates数组中的第一个元素会被过滤。-事实并非如此;传递给.Field的表达式用于通过访问该表达式来构建模型上该字段的字符串路径。您完全正确,忽略了数组具有/将具有其他命名对象。将删除不必要的评论。谢谢你的回复尼尔。你的建议听起来不错,我会研究一下以提高效率。然而,经过进一步的修改,我发现在使用NEST时,在第一个查询中实际上遇到了标准延迟。我改变了查询的顺序,发现无论查询实际有多简单,第一个查询总是需要大约一秒钟的时间。我尝试的月查询是
{
"tourId":"ABC123",
"tourName":"Super cool tour",
"duration":12,
"countryCode":"MM",
"regionCode":"AS",
...
"availability":[
{
"startDate":"2021-02-01T00:00:00",
...
},
{
"startDate":"2021-01-11T00:00:00",
...
}
]
}
var response = await elastic.SearchAsync<Tour>(s => s
.Query(q => q
.Nested(n => n
.Path(p => p.Availability)
.Query(nq => nq
.DateRange(r => r
.Field(f => f.Availability.First().StartDate)
.GreaterThanOrEquals(new DateTime(2020, 07, 01))
.LessThan(new DateTime(2020, 08, 01))
)
)
)
)
.Size(20)
.Source(s => s.IncludeAll().Excludes(e => e.Fields(f => f.Availability)))
);
var response = await elastic.SearchAsync<Tour>(s => s
.Query(q => q
.Nested(n => n
.Path(p => p.Availability)
.Query(nq => nq
.Term(t => t
.Field(f => f.Availability.First().YearMonth)
.Value(202007)
)
)
)
)
.Size(20)
.Source(s => s.IncludeAll().Excludes(e => e.Fields(f => f.Availability)))
.Profile()
);
{
"Shards":[
{
"Aggregations":[
],
"Id":"[pr4Os3Y7RT-gXRWR0gxoEQ][tours][0]",
"Searches":[
{
"Collector":[
{
"Children":[
{
"Children":[
],
"Name":"SimpleTopDocsCollectorContext",
"Reason":"search_top_hits",
"TimeInNanoseconds":6589867
}
],
"Name":"CancellableCollector",
"Reason":"search_cancelled",
"TimeInNanoseconds":13981165
}
],
"Query":[
{
"Breakdown":{
"Advance":5568,
"BuildScorer":2204354,
"CreateWeight":25661,
"Match":0,
"NextDoc":3650375,
"Score":3795517
},
"Children":null,
"Description":"ToParentBlockJoinQuery (availability.yearMonth:[202007 TO 202007])",
"TimeInNanoseconds":9686512,
"Type":"ESToParentBlockJoinQuery"
}
],
"RewriteTime":36118
}
]
}
]
}