elasticsearch,nest,C#,elasticsearch,Nest" /> elasticsearch,nest,C#,elasticsearch,Nest" />

C# ElasticSearch嵌套聚合

C# ElasticSearch嵌套聚合,c#,elasticsearch,nest,C#,elasticsearch,Nest,我做了很多谷歌搜索,检查了NEST和ElasticSearch的文档,但是我没有找到一个工作示例/解决我的问题 我举了个例子。在这个例子中,我想查询不同姓氏的数量以及每个家庭的工资总额 class Employee { public string First_Name { get; set; } public string Last_Name { get; set; } public int Salary { get; set; }

我做了很多谷歌搜索,检查了NEST和ElasticSearch的文档,但是我没有找到一个工作示例/解决我的问题

我举了个例子。在这个例子中,我想查询不同姓氏的数量以及每个家庭的工资总额

    class Employee
    {
        public string First_Name { get; set; }
        public string Last_Name { get; set; }
        public int Salary { get; set; }

        public Employee(string first_name, string last_name, int salary)
        {
            this.First_Name = first_name;
            this.Last_Name = last_name;
            this.Salary = salary;
        }
        public Employee() { }
    }
    private void button4_Click(object sender, EventArgs e)
    {
        // Create 4 employees
        Employee al = new Employee("Al", "Bundy", 1500);
        Employee bud = new Employee("Bud", "Bundy", 975);
        Employee marcy = new Employee("Marcy", "Darcy", 4500);
        Employee jefferson = new Employee("Jefferson", "Darcy", 0);

        // add the 4 employees to the index
        client.Index<Employee>(al);
        client.Index<Employee>(bud);
        client.Index<Employee>(marcy);
        client.Index<Employee>(jefferson);

        // query the index
        var result = client.Search<Employee>(s => s
            .Aggregations(a => a
                .Terms("Families", ts => ts
                    .Field(o => o.Last_Name)
                    .Size(10)
                    .Aggregations(aa => aa
                        .Sum("FamilySalary", sa => sa
                            .Field(o => o.Salary)
                        )
                    )
                )
            )
        );

        // Get the number of different families (Result should be 2: Bundy and Darcy)  
        // and get the family-salary of family Bundy and the family-salary for the Darcys
        var names = result.Aggs.Terms("Families");
        // ?? var x = names.Sum("Bundy");           
    }
class员工
{
公共字符串First_Name{get;set;}
公共字符串Last_Name{get;set;}
公共整数{get;set;}
公共员工(字符串名字、字符串姓氏、整数工资)
{
this.First\u Name=First\u Name;
this.Last_Name=Last_Name;
这个。薪水=薪水;
}
公共雇员(){}
}
私有无效按钮4_单击(对象发送者,事件参数e)
{
//创建4名员工
雇员al=新雇员(“al”,“邦迪”,1500);
员工巴德=新员工(“巴德”,“邦迪”,975);
员工玛西=新员工(“玛西”,“达西”,4500);
员工杰斐逊=新员工(“杰斐逊”,“达西”,0);
//将4名员工添加到索引中
客户指数(al);
客户索引(bud);
客户索引(marcy);
客户索引(杰斐逊);
//查询索引
var result=client.Search(s=>s
.聚合(a=>a
.术语(“系列”,ts=>ts
.Field(o=>o.Last_Name)
.尺寸(10)
.聚合(aa=>aa
.Sum(“家庭拉里”,sa=>sa
.Field(o=>o.Salary)
)
)
)
)
);
//获取不同家庭的数量(结果应为2:Bundy和Darcy)
//拿到邦迪家族的薪水和达西家族的薪水
var名称=结果聚合术语(“系列”);
//?var x=名称、总和(“邦迪”);
}
我需要elastic提供以下信息:
*索引中有两个不同的族
*邦迪家庭收入2475英镑
*达西一家挣4500英镑


请帮助

以下是一个完整的示例

private static void Main()
{
var defaultIndex=“员工”;
var设置=新连接设置(新Uri(“http://localhost:9200"))
.InferMappingFor(i=>i
.IndexName(默认索引)
)
.DefaultIndex(DefaultIndex)
//以下设置在开发时非常有用
//但可能不想在生产中使用它们
.DisableDirectStreaming()
.PrettyJson()
.OnRequestCompleted(callDetails=>
{
if(callDetails.RequestBodyInBytes!=null)
{
控制台写入线(
$“{callDetails.HttpMethod}{callDetails.Uri}\n”+
$“{Encoding.UTF8.GetString(callDetails.RequestBodyInBytes)}”;
}
其他的
{
WriteLine($“{callDetails.HttpMethod}{callDetails.Uri}”);
}
Console.WriteLine();
if(callDetails.ResponseBodyInBytes!=null)
{
Console.WriteLine($“状态:{callDetails.HttpStatusCode}\n”+
$“{Encoding.UTF8.GetString(callDetails.ResponseBodyInBytes)}\n”+
$“{新字符串('-',30)}\n”);
}
其他的
{
Console.WriteLine($“状态:{callDetails.HttpStatusCode}\n”+
$“{新字符串('-',30)}\n”);
}
});
var客户端=新的ElasticClient(设置);
if(client.indexists(defaultIndex.Exists)
client.DeleteIndex(defaultIndex);
CreateIndex(defaultIndex,c=>c
.Settings(s=>s
.NumberOfShard(1)
)
.Mappings(m=>m
.Map(mm=>mm
.AutoMap()
)
)
);
//创建4名员工
var al=新员工(“al”,“Bundy”,1500);
var bud=新员工(“bud”,“Bundy”,975);
var marcy=新员工(“marcy”,“Darcy”,4500);
var jefferson=新员工(“jefferson”,“Darcy”,0);
client.IndexMany(新[{al,bud,marcy,jefferson});
//在索引后刷新索引。我们在此处执行此操作只是出于示例目的,
//但在生产系统中,最好使用刷新间隔
//看https://www.elastic.co/blog/refreshing_news
client.Refresh(defaultIndex);
//查询索引
var result=client.Search(s=>s
.聚合(a=>a
.术语(“系列”,ts=>ts
.Field(o=>o.Last_Name.Suffix(“关键字”)//使用关键字子字段进行术语聚合
.尺寸(10)
.聚合(aa=>aa
.Sum(“家庭拉里”,sa=>sa
.Field(o=>o.Salary)
)
)
)
)
);
//获取不同家庭的数量(结果应为2:Bundy和Darcy)
//拿到邦迪家族的薪水和达西家族的薪水
var名称=结果聚合术语(“系列”);
foreach(names.bucket中的变量名)
{
var sum=name.sum(“FamilySalary”);
Console.WriteLine($“*family{name.Key}获得{sum.Value}”);
}
}
公营雇员
{
公共字符串First_Name{get;set;}
公共字符串Last_Name{get;set;}
公共整数{get;set;}
公共员工(字符串名字、字符串姓氏、整数工资)
{
this.First\u Name=First\u Name;
this.Last_Name=Last_Name;
这个。薪水=薪水;
}
公共雇员(){}
}
这个输出

  • 邦迪家庭收入2475英镑
  • 达西一家挣4500英镑
有几点:

  • 我已经显式地创建了带有映射的索引,供员工使用。而该示例将在没有索引的情况下运行