在Elasticsearch中返回唯一的结果

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可能不同,因此我的存储桶数组会很大,我想展示所有内容,但需要对它们进行分页。

尚未实现聚合的分页支持。请展示您想要获得的样本响应,也许有其他方法可以满足您的需求。 - Val
我已经更新了期望的结果,现在我的桶长度会更大。那么我该如何解决这个问题呢? - Priyank Bhatt
看起来你正在按parentid聚合,而不是按问题中所述的“过滤属性”进行聚合。你的目标不是很清楚,请确保更新你的问题以准确反映你想要的内容。 - Val
2个回答

1
没有直接的方法来实现这个。但是,您可以按照以下步骤获取所需的结果。
第一步。您应该知道所有的parentid。可以通过在字段parentid上执行简单的terms聚合(在此处阅读更多here),您将只获得parentid列表,而不是匹配到它的文档。最终,您将拥有比您当前预期的更小的数组。
{
  "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 并获取所有相关文档。


-1

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

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

如果您想按parentId对整个文档进行分组,这将是一个两步过程,如Sumit所解释的那样,您可以在那里使用分页。
聚合不会让您访问agg结果中的所有文档/文档ID,因此这将是一个两步过程。

有没有一种方法可以在子聚合中进行分页? - Sumit
@SumitKumar 我更新了我的答案。从问题来看,他似乎只是在寻找所有父ID的名称。目前没有办法对聚合结果进行分页。 - skgemini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接