NuSearch Nest 示例 - 嵌套类型

NuSearch Nest example - nested type

我正在关注 fantastic example of using NEST,但无法理解映射逻辑: 根据我的理解,模型层次结构是:

套餐

通过对 Nested<T>() 的调用和对 .Name().

的流畅调用,示例中映射的每个嵌套类型

这是 Nested<PackageVersion> 示例:

.Nested<PackageVersion>(n => n .Name(p => p.Versions.First()) .AutoMap()

我的问题是: 为什么在每个 Name() 调用中调用 .First()
这是否意味着只有列表中的第一项会被索引?这听起来不像您想在示例中实现的目标。
如果不是,是什么决定了整个列表应该被索引?

.Name(p => p.Versions.First()) 只是一个 lambda 表达式,它将解析为映射中用于字段的名称,即本例中的 "versions"。这不要与 Func<T1, T2> 委托的调用混淆,后者将 return 一些值 T2

在这种特殊情况下,表达式可以简单地为 p => p.Versions,因为没有超过 .First() 的对象图遍历。 Feel free to submit a Pull Request 改变 :)

编辑:

为了解决您的评论,这里的 lambda 表达式是一个 Expression Delegate,由一个表达式树组成。该树可以是 walked/visited 来构建和 return 一个 string 来表示该表达式。在这个例子中,

  1. MemberExpression is visited, the member name is retrieved 包含在 string 中时 returned
  2. MethodCallExpression is visited, the expression is evaluated to see if it is a LINQ extension method(在访问者理解的其他方法中)时,如果是,则访问后续表达式,以便它们可能有助于 string 即 returned.

Walking/visiting 表达式树是 what a LINQ provider,例如 LINQ to SQL 从表达式组成 SQL 语句。在 .Name(p => p.Versions.First()) 的情况下,表达式被遍历以构建一个 string 以用于 Elasticsearch 中的字段。使用表达式的好处是它们在构建正确的字段名称时提供了一些编译时安全性,并允许您更轻松地构建更长的字段名称,例如

.Name(p => p.Versions.First().Dependencies.First().Version)

将构建字段 "versions.dependencies.version"。这对于查询对象和嵌套类型的属性很有用。