首页 > 解决方案 > 如何在 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" : "---"
        }
    }
}
}

标签: elasticsearch

解决方案


这就是我所做的。

我的聚合链是以下顺序

嵌套->术语聚合->反向嵌套->热门点击

箭头都是子聚合的指示符。

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 个文档,如果您希望查看所有文档,可以增加数量。

让我知道这是否有帮助!


推荐阅读