elasticsearch,asp.net-core,nest,elastic-stack,C#,elasticsearch,Asp.net Core,Nest,Elastic Stack" /> elasticsearch,asp.net-core,nest,elastic-stack,C#,elasticsearch,Asp.net Core,Nest,Elastic Stack" />

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
            }
         ]
      }
   ]
}