我有一个用例,其中有像
这样的数据{
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
与...相同的可能性更大。所以我的水桶阵列会很大,我想通过对它们进行分页来显示所有这些。
答案 0 :(得分:1)
没有直接的方法可以做到这一点。但您可以按照以下步骤获得所需的结果。
第1步。您应该知道所有parentid
。可以通过在字段terms aggregation
上执行简单的parentid
(阅读更多here)来获取此数据,您将只获得parentid
的列表,而不是与之匹配的文档。最后,你将拥有一个比你目前更小的数组。
{
"aggs": {
"parentids": {
"terms": {
"field": "parentid",
"size": 0
}
}
}
}
size: 0
需要返回所有结果。阅读更多here。
OR
如果您已经知道所有parentid
的列表,那么您可以直接转到第2步。
第2步。通过parentid
过滤文档来获取相关文档,您可以在此处应用分页。
{
"from": 0,
"size": 20,
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"term": {
"parentid": "2222"
}
}
}
}
}
from
和size
用于分页,因此您可以遍历列表中的每个parentid
并获取所有相关文档。
答案 1 :(得分:-1)
如果您只是寻找按父ID分组的所有名称,您可以使用以下查询:
{
"query": {
"match_all": {}
},"aggs": {
"parent": {
"terms": {
"field": "parentid",
"size": 0
},"aggs": {
"NAME": {
"terms": {
"field": "name",
"size": 0
}
}
}
}
},"size": 0
}
如果您希望整个文档按parentdId分组,那么它将是一个两步过程,如上面的Sumit所述,您可以在那里使用分页。
聚合不允许您访问agg结果中的所有文档/文档ID,因此这必须是一个两步过程。