7

我有一个用例,其中我有类似的数据

{
    name: "John",
    parentid": "1234",
    filter: {a: '1', b: '3', c: '4'}
},
{
    name: "Tim",
    parentid": "2222",
    filter: {a: '2', b: '1', c: '4'}
},
{
    name: "Mary",
    parentid": "1234",
    filter: {a: '1', b: '3', c: '5'}
},
{
    name: "Tom",
    parentid": "2222",
    filter: {a: '1', b: '3', c: '1'}
}

预期成绩:

bucket:[{
    key: "2222",
    hits: [{
        name: "Tom" ...
    }, 
    {
        name: "Tim" ...
    }]
},
{
    key: "1234",
    hits: [{
        name: "John" ...
    },
    {
        name: "Mary" ...
    }]
}]

我想通过parentid. 虽然我可以使用顶级聚合,但我不知道如何对存储桶进行分页。因为有更多parentid不同的机会。所以我的桶数组会很大,我想展示所有这些,但通过分页来展示它们。

4

2 回答 2

1

没有直接的方法可以做到这一点。但是您可以按照这些步骤来获得所需的结果。

第 1 步。你应该知道所有parentid。可以通过在字段上执行一个简单的(在此处terms aggregation阅读更多)来获得此数据,您将只获得 的列表,而不是与之匹配的文档。最后,您将拥有一个比您目前预期的更小的数组。parentidparentid

{
  "aggs": {
    "parentids": {
      "terms": {
        "field": "parentid",
        "size": 0 
      }
    }
  }
}

size: 0 需要返回所有结果。在这里阅读更多。

或者

如果您已经知道所有列表,parentid则可以直接转到第 2 步。

步骤 2.通过过滤文档获取相关文档,parentid在这里您可以应用分页。

{
  "from": 0,
  "size": 20, 
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "term": {
          "parentid": "2222"
        }
      }
    }
  }

}

fromsize用于分页,因此您可以遍历parentid列表中的每个并获取所有相关文档。

于 2016-08-08T12:37:10.330 回答
-1

如果您只是在查找按父 ID 分组的所有名称,则可以使用以下查询:

 {
      "query": {
        "match_all": {}
      },"aggs": {
        "parent": {
          "terms": {
            "field": "parentid",
            "size": 0
          },"aggs": {
            "NAME": {
              "terms": {
                "field": "name",
                "size": 0
              }
            }
          }
        }
      },"size": 0
    }

如果您希望整个文档按 parentdId 分组,这将是一个 2 步过程,如上面 Sumit 所述,您可以在那里使用分页。

聚合不会让您访问 agg 结果中的所有文档/文档 ID,因此这必须是一个 2 步过程。

于 2016-08-25T23:10:39.140 回答