Elasticsearch Nest Client - 搜索嵌套属性

问题描述 投票:2回答:1

我很难找到有关如何使用C#中的Nest客户端搜索嵌套属性的信息。

我在索引中有大约这个形状的电子邮件对象:

    {
      subject: “This is a test”,
      content: “This is an email written as a test of the Elasticsearch system.  Thanks, Mr Tom Jones”,
      custodians: [
        {
          firstName: “Tom”,
          lastName: “Jones”,
          routeType: 0
        },
        {
          firstName: “Matthew”,
          lastName: “Billsley”,
          routeType: 1
        }
      ]
    }

您应该能够看到其中有一个名为“custodians”的数组,它是电子邮件的所有发件人和收件人的列表。在.Net中的Fluent样式查询构建器中,当我使用主题,内容和其他“第一层”属性时,我可以很好地构建查询。但我可能只想包含某些查询中routeType = 0的保管人。我似乎找不到任何关于如何实现这一目标的指导。有任何想法吗?

例如,主题字段中的“野餐”一词的查询如下所示:

Client.SearchAsync(m => m
  .Query(q => q
    .Match(f => f
      .Field(msg => msg.Subject)
      .Query(“picnic”))));

查询只能从routeType = 0和lastName =“Jones”获取索引的消息是什么?

仅供参考:这是与Elasticsearch论坛的交叉。如果我在那里得到一个好的建议,我会在这里添加。

c# elasticsearch nest fluent
1个回答
2
投票

如果您想获取具有routeType == 0保管人的消息:

Client.SearchAsync(m => m
  .Query(q => q
    .Term(t => t
      .Field(msg => msg.Custodians[0].RouteType)
      .Value(0))));

如果您想获取具有lastName == "jones"保管人的消息:

Client.SearchAsync(m => m
  .Query(q => q
    .Term(t => t
      .Field(msg => msg.Custodians[0].LastName)
      .Value("jones"))));

如果您想获取具有lastName == "jones"routeType == 0保管人的消息:

Client.SearchAsync(m => m
  .Query(q => q
    .Nested(t => t
      .Path(msg => msg.Custodians)
      .Query(nq =>
        nq.Term(t => t.Field(msg => msg.Custodians[0].RouteType).Value(0) &&
        ng.Term(t => t.Field(msg => msg.Custodians[0].LastName).Value("jones")
      )
    )
  )
);

请注意,custodians将需要映射为嵌套字段,以便最后一个查询按预期工作。有关嵌套字段的更多信息,请参阅here

© www.soinside.com 2019 - 2024. All rights reserved.