NEST ElasticSearch c#如何过滤嵌套对象

问题描述:

我们有一个“联系”类型结构,其中包含“关系”嵌套结构。我正在尝试使用NEST ElasticSearch .Net客户端来搜索并获得工作人员保存的联系人数量。但无法获得语法。NEST ElasticSearch c#如何过滤嵌套对象

这里是我有“联系”的结构:

public class FieldName : FieldNameBase 
    { 
     public const string IndexTypeName = "contact"; 

     public const string Id = @"Id"; 
     public const string Name = @"name"; 
     public const string Status = @"status"; 
     public const string FirstName = @"firstName"; 
     public const string LastName = @"lastName"; 
     public const string Email = @"email"; 
     public const string AvatarUrl = @"avatarUrl"; 

     public class Relationships 
     { 
      public const string StaffID = @"staffID"; 
      public const string ContactID = @"contactID"; 
      public const string FacebookUid = @"facebookUid"; 
      public const string Name = @"name"; 
      public const string Email = @"email"; 
      public const string Level = @"level"; 
      public const string AvatarUrl = @"avatarUrl"; 
     } 
    } 

    [ElasticType(Name = FieldName.IndexTypeName, IdProperty = FieldName.Id)] 
    public class Data : AccountData 
    { 
     [ElasticProperty(Name = FieldNameBase.Id, IncludeInAll = false, Index = FieldIndexOption.NotAnalyzed)] 
     public string Id { get; set; } 

     [ElasticProperty(Name = FieldNameBase.AccountID)] 
     public int AccountID { get; set; } 

     [ElasticProperty(Name = FieldName.FirstName, IncludeInAll = false, Index = FieldIndexOption.Analyzed)] 
     public string FirstName { get; set; } 

     [ElasticProperty(Name = FieldName.LastName, IncludeInAll = false, Index = FieldIndexOption.Analyzed)] 
     public string LastName { get; set; } 

     [ElasticProperty(Name = FieldName.Name, IncludeInAll = true, Index = FieldIndexOption.Analyzed)] 
     public string Name { get; set; } 

     [ElasticProperty(Name = FieldName.AvatarUrl, IncludeInAll = true, Index = FieldIndexOption.NotAnalyzed)] 
     public string AvatarUrl { get; set; } 

     [ElasticProperty(Name = FieldName.Email, IncludeInAll = true, Index = FieldIndexOption.NotAnalyzed)] 
     public string Email { get; set; } 

     [ElasticProperty(Name = FieldName.Phone, IncludeInAll = false, Index = FieldIndexOption.NotAnalyzed)] 
     public string Phone { get; set; } 

     [ElasticProperty(Type = FieldType.Nested)] 
     public List<Relationship> Relationships { get; set; } 

     public class Relationship 
     { 
      [ElasticProperty(Name = FieldName.Relationships.StaffID)] 
      public int? StaffID { get; set; } 

      [ElasticProperty(Name = FieldName.Relationships.ContactID, IncludeInAll=false, Index = FieldIndexOption.NotAnalyzed)] 
      public string ContactID { get; set; } 

      [ElasticProperty(Name = FieldName.Relationships.FacebookUid, IncludeInAll = false, Index = FieldIndexOption.NotAnalyzed)] 
      public string FacebookUid { get; set; } 

      [ElasticProperty(Name = FieldName.Relationships.Name, IncludeInAll = false, Index = FieldIndexOption.Analyzed)] 
      public string Name { get; set; } 

      [ElasticProperty(Name = FieldName.Relationships.Email, IncludeInAll = false, Index = FieldIndexOption.NotAnalyzed)] 
      public string Email { get; set; } 

      [ElasticProperty(Name = FieldName.Relationships.Level, IncludeInAll = false, Index = FieldIndexOption.Analyzed)] 
      public string Level { get; set; } 

      [ElasticProperty(Name = FieldName.Relationships.AvatarUrl, IncludeInAll = false, Index = FieldIndexOption.NotAnalyzed)] 
      public string AvatarUrl { get; set; } 
     } 

    } 

现在我想做的代码使用返回的结果,或只是一个计数以下(注我离开结果进入一个列表更从审判我仍然试图找出如何只得到计数以及)错误:

public int GetFriendCount(int staffID) 
    { 
     List<Data> list = new List<Data>(); 

     base.ConnectStatus = null; 

     var results = this.Client.Search<Data>(s => s 
      //.SearchType(Elasticsearch.Net.SearchType.Count) 
      .Query(q => q.MatchAll()) 
      .Filter(f => 
        f.Nested(n => n 
        .Path("relationships") 
        .Filter(f2 => f2 .Term("relationships.staffID", staffID)) 
        ) 
       ) 
      // .Nested 
      ); 

     if (results != null) 
     { 
      base.ConnectStatus = results.ConnectionStatus; 

      if (results.Documents.Count<Data>() > 0) 
       list = results.Documents.ToList<Data>(); 
     } 

     return list.Count; 
    } 

 var results = this.Client.Search<Data>(s => s 
      .Query(q => q 
       .Nested(n => n 
        .Path("relationships") 
        .Filter(f => f.Term("relationships.staffID", staffID)) 
       ) 
      ) 
     );