elasticsearch - 如何在 Elastic Search 中的嵌套对象上使用聚合?
问题描述
我是弹性搜索的新手,并试图形成查询。我在从弹性存储中提取信息时遇到了一些问题。下面,我正在尝试在弹性搜索查询中进行 groupby ..
可以说我有以下数据:
[{
"a" : {
"b" : "xxx",
"c" : "yyy"
},
"l" : {
"m" : "zzz",
"n" : "sss"
}
},
{
"a" : {
"b" : "xxx",
"c" : "qqq"
},
"l" : {
"m" : "ttt",
"n" : "jjj"
}
}
]
我想显示对象“a”中键“b”的值为“xxx”的所有行。
在上面我有两行符合我的需要。所以我想显示以上两个。这意味着它是“按 ab 分组”
我该如何实现这个弹性搜索查询?由于我希望分组的键是嵌套键,因此我无法形成查询。
任何建议,将不胜感激。
编辑1:
我正在寻找的不仅仅是“ab”键是否具有值“xxx”。我想做一个小组。因此,如果“ab”下有两条记录,值为“xxx”,“ab”下有两条记录,值为“kkk”,我希望将它们视为两组。
就像在这种情况下,结果应该是两个 json 对象,每个对象都包含它们特定的组结果。
如下所示:
{
{
{
"a" : {
"b" : "xxx",
"c" : "yyy"
},
"l" : {
"m" : "zzz",
"n" : "sss"
}
},
{
"a" : {
"b" : "xxx",
"c" : "qqq"
},
"l" : {
"m" : "ttt",
"n" : "jjj"
}
}
},
{
{
"a" : {
"b" : "kkk",
"c" : "..."
},
"l" : {
"m" : "___",
"n" : "---"
}
},
{
"a" : {
"b" : "kkk",
"c" : "..."
},
"l" : {
"m" : "___",
"n" : "---"
}
}
}
}
解决方案
这就是我所做的。
我的聚合链是以下顺序
箭头都是子聚合的指示符。
POST <your_index_name>/_search
{
"size":0,
"query":{
"match_all":{
}
},
"aggs":{
"nesting":{
"nested":{
"path":"a"
},
"aggs":{
"grouping_by":{
"terms":{
"field":"a.b"
},
"aggs":{
"parent_docs":{
"reverse_nested":{
},
"aggs":{
"mydocs":{
"top_hits":{
"size":10
}
}
}
}
}
}
}
}
}
}
这将允许您按照groupby
您的期望执行。另请注意,我假设该字段b
是关键字类型。
另请注意Top Hits
,仅显示前 10 个文档,如果您希望查看所有文档,可以增加数量。
让我知道这是否有帮助!
推荐阅读
- node.js - 使用 AWS Cognito 和 Lambda 与 Nodejs 进行 SMS 代码验证
- c++ - CRegKey 不会打开密钥
- javascript - 使用 React-Bootstrap 内联表单无法按预期工作
- r - 如何从R上的不同目录制作数据框
- excel - Excel VBA根据条件添加行,在不满足条件时停止失败
- vue.js - 错误:GraphQL 错误:不能为不可为空的字段 Mutation.updateRendezvous 返回 null
- python - 如何返回实际图像而不是 sentinelhub py 卫星数据返回的数组
- paypal - Paypal:小计和采购总额不匹配
- mysql - 仅获取用户在 Laravel Eloquent 或 MySQL 中拥有成分的食谱
- flutter - 使用 Flutter Flame 翻转精灵