过滤结果以根据另一个字段值删除具有相同字段值的文档(无聚合)

时间:2016-06-08 15:43:31

标签: elasticsearch

给出elasticsearch索引中的以下4个对象:

"hits": [
  {
    "_id": "0:0",
    "_source": {
      "id": 0,
      "version": 0,
      "published": true
    }
  },
  {
    "_id": "0:1",
    "_source": {
      "id": 0,
      "version": 1,
      "published": false,
      "latest": true
    }
  },
  {
    "_id": "1:0",
    "_source": {
      "id": 1,
      "version": 0,
      "published": true
    }
  },
  {
    "_id": "1:1",
    "_source": {
      "id": 1,
      "version": 1,
      "published": true,
      "latest": true
    }
  }
]

我想找到使用这些规则的文件:

  • published:true
  • 无重复id
  • 应返回具有相同id最高version的文档。

因此,对于上述情况,我希望得到0:01:1

"hits": [
  {
    "_id": "0:0",
    "_source": {
      "id": 0,
      "version": 0,
      "published": true
    }
  },
  {
    "_id": "1:1",
    "_source": {
      "id": 1,
      "version": 1,
      "published": true,
      "latest": true
    }
  }
]

我知道我可以使用top_hits,但我想知道在没有它的情况下是否可行,这样主hits.hits数组将包含这些结果。

我可能会按照以下方式进行折叠:

{ 
  query  : {...},
  aggs : {
    ids: {
      terms: {
          field: "id"
      },
      aggs:{
          dedup:{
            top_hits:{ size:1, sort: {version : 'desc'} }
          }
        }    
    }
  }
}

我希望避免使用top_hits的原因是我需要在应用程序中更新结果解析器。如果我这样做,size字段也无法正常工作。

1 个答案:

答案 0 :(得分:0)

要回答我自己的问题based on this answer,如果不使用top_hits聚合,就无法做到这一点。我认为我想要实现的目标并不是聚合的最佳用途。相反,我会通过将latestPublished true添加到相关模型来调整索引模型,从而允许查询为{ term: { latestPublished: true}}