2

We have a "Contact" Type structure that contains a "Relationships" nested structure. I am trying to use the NEST ElasticSearch .Net client to search and get a count of the number of contacts a staff member has saved. But cannot get the syntax down.

Here is what I have for the structure of "Contact":

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

    }

Now what I am trying to use as the code to return results or just a count is the following (Note I left the results going into a List more from trial an error as I'm still trying to figure out how to just get a count as well):

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

1 Answer 1

3
        var results = this.Client.Search<Data>(s => s
            .Query(q => q
                .Nested(n => n
                    .Path("relationships")
                    .Filter(f => f.Term("relationships.staffID", staffID))
                )
            )
        );
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.