【问题标题】:NEST ElasticSearch c# how to Filter on Nested ObjectNEST ElasticSearch c#如何过滤嵌套对象
【发布时间】:2017-09-18 18:11:04
【问题描述】:

我们有一个“联系人”类型结构,其中包含一个“关系”嵌套结构。我正在尝试使用 NEST ElasticSearch .Net 客户端来搜索并计算员工保存的联系人数量。但无法降低语法。

这是我对“联系人”结构的看法:

    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;
    }

【问题讨论】:

    标签: c# .net elasticsearch nest nosql


    【解决方案1】:
            var results = this.Client.Search<Data>(s => s
                .Query(q => q
                    .Nested(n => n
                        .Path("relationships")
                        .Filter(f => f.Term("relationships.staffID", staffID))
                    )
                )
            );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 2020-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多