返回弹性搜索中的唯一结果

Pri*_*att 7 elasticsearch elasticsearch-aggregation

我有一个用例,其中我有数据

{
    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'}
}
Run Code Online (Sandbox Code Playgroud)

预期成绩:

bucket:[{
    key: "2222",
    hits: [{
        name: "Tom" ...
    }, 
    {
        name: "Tim" ...
    }]
},
{
    key: "1234",
    hits: [{
        name: "John" ...
    },
    {
        name: "Mary" ...
    }]
}]
Run Code Online (Sandbox Code Playgroud)

我想通过返回唯一的文件parentid.虽然我可以使用顶级聚合,但我不知道如何对存储桶进行分页.因为有更多的机会parentid与众不同.所以我的桶阵列会很大,我想通过对它们进行分页来显示所有这些.

Sum*_*mar 1

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

步骤1.你应该知道一切parentid。可以通过在字段上执行简单的操作(在此处terms aggregation阅读更多)来获取此数据,您将仅获得 的列表,而不是与其匹配的文档。最后,您将拥有一个比您当前预期更小的阵列。parentidparentid

{
  "aggs": {
    "parentids": {
      "terms": {
        "field": "parentid",
        "size": 0 
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

或者

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

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