【问题标题】:NuSearch Nest example - nested typeNuSearch Nest 示例 - 嵌套类型
【发布时间】:2023-03-25 04:41:02
【问题描述】:

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

  • ...(某些属性)
  • List<PackageVersion>
  • List<PackageAuthor>

示例中通过调用Nested<T>() 和流畅调用.Name() 映射的每个嵌套类型。

这是Nested<PackageVersion> 示例:

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

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

【问题讨论】:

    标签: c# elasticsearch nest elasticsearch-5


    【解决方案1】:

    .Name(p =&gt; p.Versions.First()) 只是一个 lambda 表达式,它将解析为映射中的字段使用的名称,在这种情况下为 "versions"。不要将这与调用Func&lt;T1, T2&gt; 委托混淆,后者将返回一些值T2

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

    编辑:

    为了解决您的评论,这里的 lambda 表达式是一个 Expression Delegate,由一个表达式树组成。可以遍历/访问该树以构建并返回 string 来表示该表达式。在这个例子中,

    1. 当访问MemberExpression 时,the member name is retrieved 并包含在返回的string
    2. 当访问MethodCallExpression 时,表达式被评估为see if it is a LINQ extension method(在访问者理解的其他方法中),如果是,则访问后续表达式,以便它们可能有助于string被退回。

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

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

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

    【讨论】:

    • 这有点令人困惑,因为从列表中“挑选”一个项目与这个 lambda 试图表达的命名无关。我仍然不确定它是如何工作的 - lambda 是如何返回 "versions"??
    猜你喜欢
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 2017-03-20
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 2013-12-30
    相关资源
    最近更新 更多