C# ElasticSearch嵌套聚合
我做了很多谷歌搜索,检查了NEST和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; }
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英镑