我有一份文件,可以描述如下:
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
鉴于sometext4
和sometext11
分别是基于时间戳的itemId1
和itemId2
的最新条目。
目前,我正在使用userId
作为过滤器进行查询,然后在代码中对结果进行后处理。然而,这需要总是在不需要的情况下获取相当大的搜索结果,我想知道是否有办法在ES中完全(或至少大部分)完成,而无需任何后处理。
非常感谢任何帮助!
更新
到目前为止我发现的唯一近似值是:
{
"aggregations": {
"streamId": {
"terms": {
"field": "itemId1",
"order": {
"time": "desc"
}
},
"aggregations": {
"time": {
"max": {
"field": "_timestamp"
}
}
}
}
}
}
这不仅为您提供了itemId和timestamp,而且还提供了完整的文档。
答案 0 :(得分:0)
这可能可能使用称为分组/字段折叠的功能完成。 遗憾的是,此功能尚未登陆Elasticsearch,请参阅:https://github.com/elasticsearch/elasticsearch/issues/256
afaik,没有别的方法可以做到这一点。