【问题标题】:Return unique results in elasticsearch在弹性搜索中返回唯一结果
【发布时间】:2016-12-09 16:06:33
【问题描述】:

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

{
    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 不同的可能性更大。所以我的桶数组会很大,我想显示所有这些,但要通过分页来显示。

【问题讨论】:

  • Paging support for aggregation 尚未实现。请显示您希望获得的示例回复,也许还有另一种方式可以满足您的需求。
  • 我已经更新了预期的结果,现在我的存储桶长度会更大。那么我该如何解决这个问题。
  • 您似乎是按parentid 进行聚合,而不是按您的问题中所述的“过滤器属性”进行聚合。您的目标不是很明确,请确保更新您的问题以准确反映您的需求。

标签: elasticsearch elasticsearch-aggregation


【解决方案1】:

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

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

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

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

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

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

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

}

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

【讨论】:

    【解决方案2】:

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

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

    如果您希望整个文档按 parentdId 分组,这将是一个由 Sumit 解释的两步过程,您可以在那里使用分页。

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

    【讨论】:

    • 有没有办法在子聚合中进行分页?
    • @SumitKumar 更新了我的答案。从问题来看,他似乎只是在寻找所有父母 ID 的名字。不,目前没有办法对聚合结果进行分页。
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2012-03-06
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多