我正在关注fantastic example of using NEST并且无法理解映射逻辑: 根据我的理解,模型层次结构是:
包
file_get_contents
List<PackageVersion>
通过调用List<PackageAuthor>
和流畅调用Nested<T>()
,示例中映射了每个嵌套类型。
以下是.Name()
示例:
Nested<PackageVersion>
我的问题是:
为什么在每个.Nested<PackageVersion>(n => n
.Name(p => p.Versions.First())
.AutoMap()
来电中拨打.First()
?
这是否意味着只会将列表中的第一项编入索引?这听起来不像你想要在例子中实现的那样
如果没有,是什么决定整个列表应该被编入索引?
答案 0 :(得分:0)
.Name(p => p.Versions.First())
只是一个lambda表达式,它将解析为映射中的字段使用的名称,即"versions"
。不要将Func<T1, T2>
委托的调用与返回某些值T2
混淆。
在这种特殊情况下,表达式可能只是p => p.Versions
,因为除了.First()
之外没有对象图的遍历。 Feel free to submit a Pull Request改变:)
修改强>
为了解决你的评论,这里的lambda表达式是一个Expression Delegate,由一个表达式树组成。可以遍历/访问该树以构建并返回string
来表示该表达式。通过这个例子,
MemberExpression
时,the member name is retrieved并包含在返回的string
中MethodCallExpression
时,表达式将被评估为see if it is a LINQ extension method(以及访问者理解的其他方法),如果是,则访问后续表达式,以便他们可以参与返回string
。行走/访问表达式树是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"
。这对于查询对象和嵌套类型的属性非常有用。