使用唯一键在弹性搜索中分组

时间:2014-03-28 17:15:02

标签: elasticsearch key unique grouping

我有一份文件,可以描述如下:

itemId1, {userid1, userid2, userid3}, sometext1
itemId1, {userid1, userid2, userid3}, sometext2
itemId1, {userid1, userid2, userid3}, sometext3
itemId1, {userid1, userid2, userid3}, sometext4
itemId2, {userid1, userid3, userid4}, sometext6
itemId2, {userid1, userid3, userid4}, sometext7
itemId2, {userid1, userid3, userid4}, sometext8
itemId2, {userid1, userid3, userid4}, sometext9
itemId2, {userid1, userid3, userid4}, sometext10
itemId2, {userid1, userid3, userid4}, sometext11

每个文档也都有ES时间戳。使用ES我想获得给定userId的项目列表,其中只有结果中存在最新的itemId。

例如,userid1的结果必须只返回以下两个结果:

itemId1, {userid1, userid2, userid3}, sometext4
itemId2, {userid1, userid3, userid4}, sometext11

鉴于sometext4sometext11分别是基于时间戳的itemId1itemId2的最新条目。

目前,我正在使用userId作为过滤器进行查询,然后在代码中对结果进行后处理。然而,这需要总是在不需要的情况下获取相当大的搜索结果,我想知道是否有办法在ES中完全(或至少大部分)完成,而无需任何后处理。

非常感谢任何帮助!

更新

到目前为止我发现的唯一近似值是:

{
  "aggregations": {
    "streamId": {
      "terms": {
        "field": "itemId1",
        "order": {
          "time": "desc"
        }
      },
      "aggregations": {
        "time": {
          "max": {
            "field": "_timestamp"
          }
        }
      }
    }
  }
}

这不仅为您提供了itemId和timestamp,而且还提供了完整的文档。

1 个答案:

答案 0 :(得分:0)

这可能可能使用称为分组/字段折叠的功能完成。 遗憾的是,此功能尚未登陆Elasticsearch,请参阅:https://github.com/elasticsearch/elasticsearch/issues/256

afaik,没有别的方法可以做到这一点。