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

时间:2016-08-03 19:20:14

标签: 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'}
}

预期结果:

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

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

2 个答案:

答案 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"
        }
      }
    }
  }

}

fromsize用于分页,因此您可以遍历列表中的每个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,因此这必须是一个两步过程。